hive加载json数据和解析json

事先说明,本人菜鸡一只,若是有说错的地方,还请你们指出批评,多多包涵~apache

1、json

今天记录一下使用hive怎么加载json格式的数据,对于json格式,就很少作更多说明了,测试的数据是spark的example里面的people.json,数据不多,可是说明状况足矣。数组

先给出官网地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual%20DDL#LanguageManualDDL-JSON服务器

数据是这样的:函数

{"name":"Michael"}oop

{"name":"Andy", "age":30}测试

{"name":"Justin", "age":19}spa

一个大括号是一个对象(一行数据),而后Michael这位小朋友age字段是缺失的。3d

一、接着开启hive,建立表(建表语句以下):code

 create table spark_people_json( 

`name` string,

`age`   int)

ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'

STORED AS TEXTFILE;

二、可是这样直接使用JsonSerDe类,是会报错的,由于这个类并无在初始化的时候加载到环境中

报错以下:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Cannot validate serde: org.apache.hive.hcatalog.data.JsonSerDe

三、所以先执行

ADD JAR ${HIVE_HOME}/hcatalog/share/hcatalog/hive-hcatalog-core-0.13.1-cdh5.3.6.jar

注:${HIVE_HOME}是hive的根目录,本身对应替换,还有本文测试的hive是hive-0.13.1-cdh5.3.6这个版本的,不一样版本这个jar可能会有点路径上的区别,可是理论上是能找获得的!实在不行能够在中央仓库找找:http://mvnrepository.com/

四、在环境中添加了jar以后,接着建立表,就能够成功建立了(hive加载不一样的数据使用的分隔符多是不一样的类,能够研究下这些类是怎么写的,就能够写出符合本身需求的分割类,而后打成jar包上传服务器,add就能够了,不过大多数通用的数据类型都是有对应的别人写好的类的,例如csv/tsv的就叫org.apache.hadoop.hive.serde2.OpenCSVSerde

五、建立好表以后,就load数据

load  data local inpath '/datas/people.json' into table spark_people_json;

六、最后进行select获得结果


七、字段缺失的值为NULL


2、

第二个是记录下若是只是某个字段为json,想要获取里面的某个值怎么操做?

有这么两个函数:get_json_object()和json_tuple()

一、get_json_object()

get_json_object函数第一个参数填写json对象变量,第二个参数使用$表示json变量标识,而后用 . 或 [] 读取对象或数组;

什么意思?

一、就是这样:

select get_json_object('{"shop":{"book":[{"price":43.3,"type":"art"},{"price":30,"type":"technology"}],"clothes":{"price":19.951,"type":"shirt"}},"name":"jane","age":"23"}', '$.shop.book[0].type')  

结果:

二、若是json简单,能够直接这样使用:

select get_json_object('{"name":"jack","server":"www.qq.com"}','$.server')

结果:


三、可是问题来了每次只能查一个字段

不信你能够试试:select get_json_object('{"name":"jack","server":"www.qq.com"}','$.server','$.name')

结果:


大概来讲,意思是这个方法,只能接受两个参数,多的不行,那么就致使咱们对同一个json数据想要查看多个值,只能多写几个get_json_object,比较麻烦,因此另外一个方法就派上了用场。

四、json_tuple

使用方法:

select json_tuple('{"name":"jack","server":"www.qq.com"}','server','name')

结果:


五、可是缺点就是对于复杂的嵌套的json,就操做不了了(就是说使用不了".",“[]”这种符号来操做json对象),因此看状况选择这两个方法去使用。

OK,想记录的东西记录完了,祝你们春节快乐~

最后,本人菜鸡一个,若是有说的不对的地方,还望各位大神指点迷津!!