1. 程式人生 > >Avro技術應用_3. 利用 Hive 表處理 Avro 資料

Avro技術應用_3. 利用 Hive 表處理 Avro 資料

本文參考於:http://www.iteblog.com/archives/1007 & <Hadoop in Practice 2>

Avro是一個數據序列化系統,設計用於支援大批量資料交換的應用。它的主要特點有:支援二進位制序列化方式,可以便捷,快速地處理大量資料;動態語言友好,Avro提供的機制使動態語言可以方便地處理Avro資料。

Hive 0.9.1 版本新繫結Avro SerDe(序列化器/反序列化器的簡稱),它允許 Hive 從表中讀取資料和寫回表. 
Hive Versions Avro Version
Hive 0.9.1 Avro 1.5.3
Hive 0.10, 0.11, and 0.12
Avro 1.7.1
Hive 0.13 and 0.14 Avro 1.7.5
如果需要在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的schema複製到HDFS上, 並建立一個目錄包含一些 Avro 股票記錄的示例:
$ hadoop fs -put $HIP_HOME/schema schema
$ hadoop fs -mkdir stock_hive

$ hip hip.ch3.avro.AvroStockFileWrite \
    --input test-data/stocks.txt \
    --output stock_hive/stocks.avro
為了解析Avro格式的資料,我們可以在Hive建表的時候用下面語句:
需要注意的是,以下建立表的格式是 Hive 通用的格式,但是在 Hive 0.14 及以後的版本里,在DDL語句中可以直接使用"STORED AS AVRO 2.1 在定義中指定 schema
hive> CREATEEXTERNAL TABLEtweets > COMMENT "A table backed by Avro data with the  >        Avro schema embedded in the CREATE TABLE statement" > ROW FORMAT SERDE 
'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
> STORED AS > INPUTFORMAT  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' > OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' > LOCATION '/user/wyp/examples/input/' > TBLPROPERTIES ( >    'avro.schema.literal'='{ >        "type": "record", >        "name": "Tweet", >        "namespace": "com.miguno.avro", >        "fields": [ >            { "name":"username",  "type":"string"}, >            { "name":"tweet",     "type":"string"}, >            { "name":"timestamp", "type":"long"} >        ] >   }' > );
Time taken: 0.076 seconds

hive> describe tweets;
OK
username            	string              	from deserializer   
tweet               	string              	from deserializer   
timestamp           	bigint              	from deserializer
2.2  呼叫一個 shema 檔案的 URL

將avro.schema.literal中的 schame 定義存放在一個檔案中,比如:twitter.avsc

{ "type""record", "name""Tweet", "namespace""com.miguno.avro", "fields": [ { "name""username", "type""string" }, { "name""tweet", "type""string" }, { "name""timestamp", "type""long" } ] } -- Create 外部表 tweets CREATE EXTERNAL TABLE tweets COMMENT "A table backed by Avro data with the Avro schema stored in HDFS" ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' STORED AS INPUTFORMAT  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' LOCATION '/user/wyp/examples/input/' TBLPROPERTIES ( ); -- Create 外部表 stocks hive> CREATE EXTERNAL TABLE stocks COMMENT "An Avro stocks table" ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' LOCATION '/user/YOUR-HDFS-USERNAME/stock_hive/' TBLPROPERTIES ( );
hive> describe tweets;
OK
username            	string              	from deserializer   
tweet               	string              	from deserializer   
timestamp           	bigint              	from deserializer