zoukankan      html  css  js  c++  java
  • 在Hive中使用Avro

    作者:过往记忆 | 新浪微博:左手牵右手TEL | 
    可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
    博客地址:
    文章标题:
    本文链接:
    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'
    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     > );
    21 OK
    22 Time taken: 0.076 seconds
    23  
    24 hive> describe tweets;                                                            
    25 OK
    26 username                string                  from deserializer  
    27 tweet                   string                  from deserializer  
    28 timestamp               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/目录下:

    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中的

    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,然后上面的建表语句就可以修改为:

    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'
    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

  • 相关阅读:
    [设计模式整理笔记 五] 创建者模式(Builder)
    ArrayList与List<T>笔记
    asp.net站点URLRewrite小记
    ArrayList Array List<T>性能比较
    C# Socket SSL通讯笔记
    [设计模式整理笔记 六] 工厂模式与创建者模式总结
    [设计模式整理笔记 七] 原型模式(ProtoType)
    实现页面提交时显示"正在处理.."
    [设计模式整理笔记 四] 抽象工厂模式(Abstract Factory)
    在 ASP.NET 中执行 URL 重写 [转MSDN]
  • 原文地址:https://www.cnblogs.com/xd502djj/p/4089644.html
Copyright © 2011-2022 走看看