在Hive中使用Avro


作者:過往記憶 | 新浪微博:左手牽右手TEL | 
可以轉載, 但必須以超鏈接形式標明文章原始出處和作者信息及版權聲明
博客地址:
文章標題:
本文鏈接:
Hadoop、Hive、Hbase、Flume等QQ交流群:138615359(已滿),請加入新群:149892483

本博客的微信公共帳號為:iteblog_hadoop,歡迎大家關注。
如果你覺得本文對你有幫助,不妨分享一次,你的每次支持,都是對我最大的鼓勵

如果本文的內容對您的學習和工作有所幫助,不妨支付寶贊助(wyphao.2007@163.com)一下


  Avro(讀音類似於[ævrə])是Hadoop的一個子項目,由Hadoop的創始人Doug Cutting牽頭開發。Avro是一個數據序列化系統,設計用於支持大批量數據交換的應用。它的主要特點有:支持二進制序列化方式,可以便捷,快速地處理大量數據;動態語言友好,Avro提供的機制使動態語言可以方便地處理Avro數據。
  在Hive中,我們可以將數據使用Avro格式存儲,本文以avro-1.7.1.jar為例,進行說明。

  如果需要在 Hive中使用Avro,需要在$HIVE_HOME/lib目錄下放入以下四個工具包:avro-1.7.1.jar、avro-tools-1.7.4.jar、 jackson-core-asl-1.8.8.jar、jackson-mapper-asl-1.8.8.jar。當然,你也可以把這幾個包存在別的路徑下面,但是你需要把這四個包放在CLASSPATH中。

  為了解析Avro格式的數據,我們可以在Hive建表的時候用下面語句:

01 hive> CREATE EXTERNAL TABLE tweets
02     > COMMENT "A table backed by Avro data with the
03     >        Avro schema embedded in the CREATE TABLE statement"
04     > ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
05     > STORED AS
06     > INPUTFORMAT  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
07     > OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
08     > LOCATION '/user/wyp/examples/input/'
09     > TBLPROPERTIES (
10     >    'avro.schema.literal'='{
11     >        "type""record",
12     >        "name""Tweet",
13     >        "namespace""com.miguno.avro",
14     >        "fields": [
15     >            { "name":"username",  "type":"string"},
16     >            { "name":"tweet",     "type":"string"},
17     >            { "name":"timestamp""type":"long"}
18     >        ]
19     >   }'
20     > );
21 OK
22 Time taken: 0.076 seconds
23  
24 hive> describe tweets;                                                            
25 OK
26 username                string                  from deserializer  
27 tweet                   string                  from deserializer  
28 timestamp               bigint                  from deserializer

然后用Snappy壓縮我們需要的數據,下面是壓縮前我們的數據:

01 {
02    "username""miguno",
03    "tweet""Rock: Nerf paper, scissors is fine.",
04    "timestamp"1366150681
05 },
06 {
07    "username""BlizzardCS",
08    "tweet""Works as intended.  Terran is IMBA.",
09    "timestamp"1366154481
10 },
11 {
12    "username""DarkTemplar",
13    "tweet""From the shadows I come!",
14    "timestamp"1366154681
15 },
16 {
17    "username""VoidRay",
18    "tweet""Prismatic core online!",
19    "timestamp"1366160000
20 }

壓縮完的數據假如存放在/home/wyp/twitter.avsc文件中,我們將這個數據復制到HDFS中的/user/wyp/examples/input/目錄下:

1 hadoop fs -put /home/wyp/twitter.avro  /user/wyp/examples/input/

然后我們就可以在Hive中使用了:

1 hive> select * from tweets limit 5;;
2 OK
3 miguno  Rock: Nerf paper, scissors is fine. 1366150681
4 BlizzardCS  Works as intended.  Terran is IMBA. 1366154481
5 DarkTemplar From the shadows I come!    1366154681
6 VoidRay Prismatic core online!  1366160000
7 Time taken: 0.495 seconds, Fetched: 4 row(s)

當然,我們也可以將avro.schema.literal中的

01 {
02    "type""record",
03    "name""Tweet",
04    "namespace""com.miguno.avro",
05    "fields": [
06       {
07          "name""username",
08          "type""string"
09       },
10       {
11          "name""tweet",
12          "type""string"
13       },
14       {
15          "name""timestamp",
16          "type""long"
17       }
18    ]
19 }

存放在一個文件中,比如:twitter.avsc,然后上面的建表語句就可以修改為:

01 CREATE EXTERNAL TABLE tweets
02     COMMENT "A table backed by Avro data with the Avro schema stored in HDFS"
03     ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
04     STORED AS
05     INPUTFORMAT  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
06     OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
07     LOCATION '/user/wyp/examples/input/'
08     TBLPROPERTIES (
09         'avro.schema.url'='hdfs:///user/wyp/examples/schema/twitter.avsc'
10     );

效果和上面的一樣。本博客文章除特別聲明,全部都是原創!

尊重原創,轉載請注明: 轉載自過往記憶(http://www.iteblog.com/)
本文鏈接地址: 《在Hive中使用Avro》(http://www.iteblog.com/archives/1007)

轉自http://www.iteblog.com/archives/1007

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM