作者:过往记忆 | 新浪微博:左手牵右手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'
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

在Hive中使用Avro的更多相关文章

  1. hive中数据存储格式对比:textfile,parquent,orc,thrift,avro,protubuf

    这篇文章我会从业务中关注的: 1. 存储大小 2.查询效率 3.是否支持表结构变更既数据版本变迁 5.能否避免分隔符问题 6.优势和劣势总结 几方面完整的介绍下hive中数据以下几种数据格式:text ...

  2. Hive中的HiveServer2、Beeline及数据的压缩和存储

    1.使用HiveServer2及Beeline HiveServer2的作用:将hive变成一种server服务对外开放,多个客户端可以连接. 启动namenode.datanode.resource ...

  3. SparkSQL读取Hive中的数据

    由于我Spark采用的是Cloudera公司的CDH,并且安装的时候是在线自动安装和部署的集群.最近在学习SparkSQL,看到SparkSQL on HIVE.下面主要是介绍一下如何通过SparkS ...

  4. hive中rcfile格式(收藏文)

    首先声明,此文是属于纯粹收藏文,感觉讲的很不错. 本文介绍了Facebook公司数据分析系统中的RCFile存储结构,该结构集行存储和列存储的优点于一身,在MapReduce环境下的大规模数据分析中扮 ...

  5. hive中分析函数window子句

    hive中有些分析函数功能确实很强大,在和sum,max等聚合函数结合起来能实现不少功能. 直接上代码演示吧 原始数据 channel1 2016-11-10 1 channel1 2016-11-1 ...

  6. hive中的一种假NULL现象

    使用hive时,我们偶尔会遇到这样的问题,当你将结果输出到屏幕时,查出的数据往往显示为null,但是当你将结果输出到文本时,却显示为空(即未填充),这是为什么呢? 在hive中有一种假NULL,它看起 ...

  7. hive中导入json格式的数据(hive分区表)

    hive中建立外部分区表,外部数据格式是json的如何导入呢? json格式的数据表不必含有分区字段,只需要在hdfs目录结构中体现出分区就可以了 This is all according to t ...

  8. sqoop将关系型数据库的表导入hive中

    1.sqoop 将关系型数据库的数据导入hive的参数说明:

  9. hive中order by,sort by, distribute by, cluster by作用以及用法

    1. order by     Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的 ...

随机推荐

  1. jQuery EasyUI 简介

    简介 jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用户界面插件. 特点: ①easyui 是一个基于 jQuery 的框架,集成了各种用户界面插件. ②easyui 提供建 ...

  2. 异常处理、socke基于TCP协议编程

    一.异常处理 1.错误和异常 1.程序中难免出现错误,而错误分成两种 (1)语法错误(这种错误过不了Python解释器的语法检测,必须在程序执行前改正) #语法错误示范一 if #语法错误示范二 de ...

  3. Linux学习笔记(12)linux文件目录与用户管理

    基本常用目录 1.文件及目录 1.1.文件/文件夹权限 用法: (1)    chgrp group_name dir_name/file_name, (2)    chown user_name:g ...

  4. Angular学习笔记—创建一个angular项目

    开始项目前,你需要先安装node和npm,然后执行npm install -g @angular/cli安装Angular CLI. 如何安装node.js和npm npm使用介绍 1.安装angul ...

  5. 简明python教程七----面向对象的编程

    根据操作数据的函数或语句块来设计程序的,被称为面向过程的编程. 把数据和功能结合起来,用称为对象的东西包裹起来的组织程序的方法,称为面向对象的编程理念. 类和对象是面向对象编程的两个主要方面.类创建一 ...

  6. sql server 中having 的使用注意事项

    1.having 中不能使用未参与分列的组,having 不能替代where 作用不一样,having是对组进行过滤,where是每条记录进行过滤. 2.having 是对Group By 的条件分组 ...

  7. python16_day17【Django_session、ajax】

    一.Session 1.settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) SESSION_COOK ...

  8. DP专题·四(树形dp)

    1.poj 115 TELE 题意:一个树型网络上有n个结点,1~n-m为信号传送器,n-m+1~n为观众,当信号传送给观众后,观众会付费观看,每铺设一条道路需要一定费用.现在求以1为根,使得收到观众 ...

  9. Node.js API学习笔记(二)

    本文发表于本人博客. 上一节笔记说到创建Buffer实例,这节继续讲Buffer.本节讲解下Buffer的一些静态方法.写入以及读取方法. Buffer.isEncoding(编码)判断nodejs是 ...

  10. PHP范例注册审核

    <body> <h1>注册</h1> <form action="zcchuli.php" method="post" ...