Avro技术应用_3. 利用 Hive 表处理 Avro 数据

本文参考于:http://www.iteblog.com/archives/1007 &

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" 来指定表为Avro格式。AvroSerDe 会根据 Hive 表的Schema 来创建适合的 Avro Schema。这大大增加了 Avro 在 Hive 中的可用性。
详细请参考:https://cwiki.apache.org/confluence/display/Hive/AvroSerDe
 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 (
         'avro.schema.url' = 'hdfs:///user/wyp/examples/schema/twitter.avsc'
     );
 
-- 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 (
'avro.schema.url' = 'hdfs:///user/YOUR-HDFS-USERNAME/schema/stock.avsc'
   );

hive> describe tweets;
OK
username            	string              	from deserializer   
tweet               	string              	from deserializer   
timestamp           	bigint              	from deserializer

 
   
AvroSerDe 实际上支持4种方法来为 Avro Tasble 定义一个 Schema: (详细参考:https://cwiki.apache.org/confluence/display/Hive/AvroSerDe.)
  • Use avro.schema.url -- 如上例 2.2
  • Use schema.literal and embed the schema in the create statement
  • Use avro.schema.literal and pass the schema into the script -- 如上例 2.1
  • Use none to ignore either avro.schema.literal or avro.schema.url

你可以通过 Describe 关键词来查询一个 Hive 表的 Schema :

hive> describe stocks;
symbol                  string
date                     string
open                     double
high                     double
 
low                      double
close                    double
volume                   int
adjclose                 double

运行一个 query 来确认是否完成了,可以通过如下的 Hive Query Language (HiveQL) 来记录每个股票代码的数量 -- stock symbol:

hive>  SELECT  symbol,  count (*)  FROM  stocks  GROUP  BY  symbol;
AAPL    10
CSCO    10
GOOG    5
MSFT    10

你可能感兴趣的:(Avro,Data,Serilizaton,Hive)