作者:过往记忆 | 新浪微博:左手牵右手TEL | 
可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
博客地址:http://www.iteblog.com/
文章标题:《在Hive中使用Avro》
本文链接:http://www.iteblog.com/archives/1007
Hadoop、Hive、Hbase、Flume等QQ交流群:138615359(已满),请加入新群:149892483

本博客的微信公共帐号为:iteblog_hadoop,欢迎大家关注。
如果你觉得本文对你有帮助,不妨分享一次,你的每次支持,都是对我最大的鼓励

如果本文的内容对您的学习和工作有所帮助,不妨支付宝赞助([email protected])一下在Hive中使用Avro-LMLPHP

  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建表的时候用下面语句:

01hive> 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    > );
21OK
22Time taken: 0.076 seconds
23 
24hive> describe tweets;                                                            
25OK
26username                string                  from deserializer  
27tweet                   string                  from deserializer  
28timestamp               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/目录下:

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

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

1hive> select * from tweets limit 5;;
2OK
3miguno  Rock: Nerf paper, scissors is fine. 1366150681
4BlizzardCS  Works as intended.  Terran is IMBA. 1366154481
5DarkTemplar From the shadows I come!    1366154681
6VoidRay Prismatic core online!  1366160000
7Time 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,然后上面的建表语句就可以修改为:

01CREATE 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

05-21 10:16