文档章节

Hive Json数据存储格式

水东流
 水东流
发布于 2016/07/08 18:21
字数 889
阅读 678
收藏 0

https://cwiki.apache.org/confluence/display/Hive/Json+SerDe

 

数据以json的形式存放,一行一个json数据。

要是

{"field1":"data1","field2":100,"field3":"more data1","field4":123.001} {"field1":"data2","field2":200,"field3":"more data2","field4":123.002} {"field1":"data3","field2":300,"field3":"more data3","field4":123.003} {"field1":"data4","field2":400,"field3":"more data4","field4":123.004}

形式,而不能进行格式化!

 

下载hive-hcatalog-core.jar对应版本。

add到hive中

ADD JAR /usr/lib/hive-hcatalog/lib/hive-hcatalog-core.jar;

创建json表

CREATE TABLE json_table(a string, b bigint)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE;

 

准备数据

{"a":"k","b":1}
{"a":"l","b":2}

 

load 进来

load data local inpath '/home/hadoop/json.txt' into table json_table

 

如果load的数据不符合格式要求,比如不是json的,或者其他问题,不进行提示。

当使用表的时候,出现问题则提示。

 

复杂的json处理方式,形如这样

 

使用的时候,where conflict["xxx"]=yyy 针对map而言。其他的array和struct,参照hive文档使用即可。

现在有个新的想法,如果存在hdfs上的文件,不是想要的json格式咋办,如何通过jsonSerde读取呢?

例如:

{
    "es": "1459442280603,0,hhh,,0,tyryrt,fff gfhgfh,,,,,,,,,,,,,,1511240411010000754,\n",
    "hd": {
        "a": "90014A0507091BC4",
        "b": "19",
        "c": "74:04:2b:da:00:97"
    }
}

整个json是正常的,但是es部分,是一个串,我想把es部分也变成一个json对象array啥的,但是不能改变原来hdfs上数据的结构,毕竟很多mr程序都写好了,改动起来工程浩大。

显然的答案是自定义一个JsonSerDe即可,修改部分源码即可。

github上。https://github.com/rcongiu/Hive-JSON-Serde  非常不错,可以下载下来,修改代码,重新编译,我修改的代码是org.openx.data.jsonserde.JsonSerDe的deserialize方法,改方法从名字上可以判断是解析从hdfs上读出的数据,参数是一个writable。

 

获取es部分的代码,重新解析,生成心的json对象,最终放到总的json对象中即可

 

这样,我们创建hive表的时候,就可以使用这个es1属性了啊,

值得注意的一点:

es解析成[[xx,yy,zz],[xx1,yy1,zz1]] 那么hive定义的形式如下:

CREATE external TABLE jsontest (es string,
    es1 array<struct<name1:string,name2:string,name3:string>>,
    hd map<string,string>)

 

而最开始我的做法是:

es解析成[{"name1":xx,"name2":yy,"name3":zz},{"name1":xx1,"name2":yy1,"name3":zz1}]

然后hive表定义为:

CREATE external TABLE jsontest (es string,
    es1 array<map<string,string>>,
    hd map<string,string>)

总是总问题,而且真有问题,没反应过来呢。还是用struct吧,毕竟name可以在hive表中可以指定,而不是在代码写死。

打包编译:

mvn -Dcdh.version=1.3.1 package  -Dmaven.test.skip=true

 

 

--------------------------------------------------------

这么做,虽然能将非正规的字符解析成正规的字符,并通过hive的数据结果映射,但是有个问题,es1是一个数组,如果我想让es1的某个struct对象放在where中进行判断使用,但是es1的大小又不是固定的,而且,我也无法知道到底是数组的哪个个元素可以用来判断,因此,上述方法有弊端。

新的方法:

events1 里面使用array,但是不使用struct而是使用string

CREATE external TABLE test.nginx_logs2 (events string,
    events1 array<string>,
    header map<string,string>)
partitioned by (datepart string,app_token string) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'

这时候,源码就要拼成正规的json字符就行了。

之后使用hive explore等方法,来将events1的数组展开,接着使用get_json_obj获得json串中的某个属性。比如如下操作。

 

SELECT event_name,
       count(DISTINCT user_id) AS num
  FROM ( SELECT header["user_id"] AS user_id, get_json_object(event,'$.name') AS event_name
   FROM test.nginx_logs2 LATERAL VIEW explode(events1) events1 AS event
   WHERE get_json_object(event,'$.name')='xxx'
     AND get_json_object(event,'$.type')='0' ) f
GROUP BY event_name

 

 

© 著作权归作者所有

下一篇: Hive Index
水东流
粉丝 4
博文 51
码字总数 23858
作品 0
海淀
程序员
私信 提问
加载中

评论(2)

你在就花开
l厉害了
你在就花开
66
HAWQ技术解析(九) —— 外部数据

HAWQ不但可以读写自身系统中的表,而且能够访问HDFS、Hive、HBase等外部系统的数据。这是通过一个名为PXF的扩展框架实现的。大部分外部数据是以HAWQ外部表的形式进行访问的,但对于Hive,除外...

wzy0623
2017/03/23
0
0
基于 Hive 的文件格式:RCFile 简介及其应用

Hadoop 作为MR 的开源实现,一直以动态运行解析文件格式并获得比MPP数据库快上几倍的装载速度为优势。不过,MPP数据库社区也一直批评Hadoop由于文件格式并非为特定目的而建,因此序列化和反序...

大数据之路
2014/06/18
2.8K
1
教程:Data Lake Analytics + OSS数据文件格式处理大全

0. 前言 Data Lake Analytics是Serverless化的云上交互式查询分析服务。用户可以使用标准的SQL语句,对存储在OSS、TableStore上的数据无需移动,直接进行查询分析。 目前该产品已经正式登陆阿...

金络
2018/08/07
0
0
【转】在E-MapReduce中使用 ES-Hadoop

(本文转自E-MapReduce产品文档,详情请访问:阿里云E-MapReduce产品文档。) ES-Hadoop 是 Elasticsearch(ES) 推出的专门用于对接 Hadoop 生态的工具,使得用户可以使用 Mapreduce(MR)、Spark...

汐林
2018/10/16
0
0
[Hive]JsonSerde使用指南

注意: 重要的是每行必须是一个完整的JSON,一个JSON不能跨越多行,也就是说,serde不会对多行的Json有效。 因为这是由Hadoop处理文件的工作方式决定,文件必须是可拆分的,例如,Hadoop将在...

Mr_yul
2018/10/17
237
0

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
59分钟前
5
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部