事先说明,本人菜鸡一只,若是有说错的地方,还请你们指出批评,多多包涵~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,想记录的东西记录完了,祝你们春节快乐~
最后,本人菜鸡一个,若是有说的不对的地方,还望各位大神指点迷津!!