作者:过往记忆 | 新浪微博:左手牵右手TEL |
可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
博客地址:http://www.iteblog.com/
文章标题:《在Hive中使用Avro》
本文链接:http://www.iteblog.com/archives/1007
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' |
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/' |
10 |
> 'avro.schema.literal' ='{ |
13 |
> "namespace" : "com.miguno.avro" , |
15 |
> { "name" : "username" , "type" : "string" }, |
16 |
> { "name" : "tweet" , "type" : "string" }, |
17 |
> { "name" : "timestamp" , "type" : "long" } |
22 |
Time taken: 0.076 seconds |
24 |
hive> describe tweets; |
26 |
username string from deserializer |
27 |
tweet string from deserializer |
28 |
timestamp bigint from deserializer |
然后用Snappy压缩我们需要的数据,下面是压缩前我们的数据:
03 |
"tweet" : "Rock: Nerf paper, scissors is fine." , |
04 |
"timestamp" : 1366150681 |
07 |
"username" : "BlizzardCS" , |
08 |
"tweet" : "Works as intended. Terran is IMBA." , |
09 |
"timestamp" : 1366154481 |
12 |
"username" : "DarkTemplar" , |
13 |
"tweet" : "From the shadows I come!" , |
14 |
"timestamp" : 1366154681 |
17 |
"username" : "VoidRay" , |
18 |
"tweet" : "Prismatic core online!" , |
19 |
"timestamp" : 1366160000 |
压缩完的数据假如存放在/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 ;; |
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中的
04 |
"namespace" : "com.miguno.avro" , |
存放在一个文件中,比如: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' |
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/' |
效果和上面的一样。本博客文章除特别声明,全部都是原创!
尊重原创,转载请注明: 转载自过往记忆(http://www.iteblog.com/)
本文链接地址: 《在Hive中使用Avro》(http://www.iteblog.com/archives/1007)
转自http://www.iteblog.com/archives/1007