分享

Avro在Hive中使用指导

导读:
1.在Hive中,如何将数据使用Avro格式存储?
2.为了解析Avro格式的数据,使用什么语句创建hive表?
3.使用Avro格式的数据,hql使用是否发生 变化?



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

  1. hive> CREATE EXTERNAL TABLE tweets
  2.     > COMMENT "A table backed by Avro data with the
  3.     >        Avro schema embedded in the CREATE TABLE statement"
  4.     > ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
  5.     > STORED AS
  6.     > INPUTFORMAT  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
  7.     > OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
  8.     > LOCATION '/user/wyp/examples/input/'
  9.     > 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.     > );
  21. OK
  22. Time taken: 0.076 seconds
  23. hive> describe tweets;                                                            
  24. OK
  25. username                    string                      from deserializer   
  26. tweet                       string                      from deserializer   
  27. timestamp                   bigint                      from deserializer
复制代码
然后用Snappy压缩我们需要的数据,下面是压缩前我们的数据:

  1. {
  2.    "username": "miguno",
  3.    "tweet": "Rock: Nerf paper, scissors is fine.",
  4.    "timestamp": 1366150681
  5. },
  6. {
  7.    "username": "BlizzardCS",
  8.    "tweet": "Works as intended.  Terran is IMBA.",
  9.    "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/目录下:


  1. hadoop fs -put /home/wyp/twitter.avro  /user/wyp/examples/input/
复制代码

然后我们就可以在Hive中使用了:
  1. hive> select * from tweets limit 5;;
  2. OK
  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中的
  1. {
  2.    "type": "record",
  3.    "name": "Tweet",
  4.    "namespace": "com.miguno.avro",
  5.    "fields": [
  6.       {
  7.          "name": "username",
  8.          "type": "string"
  9.       },
  10.       {
  11.          "name": "tweet",
  12.          "type": "string"
  13.       },
  14.       {
  15.          "name": "timestamp",
  16.          "type": "long"
  17.       }
  18.    ]
  19. }
复制代码
存放在一个文件中,比如:twitter.avsc,然后上面的建表语句就可以修改为:
  1. CREATE EXTERNAL TABLE tweets
  2.     COMMENT "A table backed by Avro data with the Avro schema stored in HDFS"
  3.     ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
  4.     STORED AS
  5.     INPUTFORMAT  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
  6.     OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
  7.     LOCATION '/user/wyp/examples/input/'
  8.     TBLPROPERTIES (
  9.         'avro.schema.url'='hdfs:///user/wyp/examples/schema/twitter.avsc'
  10.     );
复制代码
效果和上面的一样。














已有(1)人评论

跳转到指定楼层
june_fu 发表于 2015-3-8 20:55:36
解释是清楚了,不过在HIVE中处理AVRO格式存储的数据是有什么好处么?处理速度快还是什么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条