Avro技術應用_3. 利用 Hive 表處理 Avro 資料
阿新 • • 發佈:2019-02-12
本文參考於:http://www.iteblog.com/archives/1007 &
<Hadoop in Practice 2>
Avro是一個數據序列化系統,設計用於支援大批量資料交換的應用。它的主要特點有:支援二進位制序列化方式,可以便捷,快速地處理大量資料;動態語言友好,Avro提供的機制使動態語言可以方便地處理Avro資料。
Hive 0.9.1 版本新繫結Avro SerDe(序列化器/反序列化器的簡稱),它允許 Hive 從表中讀取資料和寫回表.
如果需要在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 股票記錄的示例:
需要注意的是,以下建立表的格式是 Hive 通用的格式,但是在 Hive 0.14 及以後的版本里,在DDL語句中可以直接使用"STORED AS AVRO 2.1 在定義中指定 schema
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 |
你需要將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>
CREATE
EXTERNAL
TABLE
tweets
> 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