千家信息网

Hive Json数据存储格式是怎么样的

发表于:2024-10-06 作者:千家信息网编辑
千家信息网最后更新 2024年10月06日,这篇文章主要介绍Hive Json数据存储格式是怎么样的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数据以json的形式存放,一行一个json数据。要是{"field1":"
千家信息网最后更新 2024年10月06日Hive Json数据存储格式是怎么样的

这篇文章主要介绍Hive Json数据存储格式是怎么样的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

数据以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>,
hd map)

而最开始我的做法是:

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

然后hive表定义为:

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

总是总问题,而且真有问题,没反应过来呢。还是用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,
header map)
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 Json数据存储格式是怎么样的"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

0