内置函数
json_tuple(jsonStr, k1, k2, ...)
参数为一组键k1,k2……和JSON字符串,返回值的元组。该方法比 get_json_object
高效,因为可以在一次调用中输入多个键
写java类:
创建java project:例hive-json
将所有jar放入所建项目的lib目录下。
选中项目中lib目录下的jar→右键→build path。
import org.apache.hadoop.hive.ql.exec.UDF;
public class JsonParser extends UDF {
// 重载父类中的一个方法evaluate()
private String evaluate(String json,int index) {
//{"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"}
String[] fields = json.split("\"");
return fields[4*index-1];
}
}
将该类打成jar包:右键项目export
上传jar到hive所在的机器
sftp> put d:/路径/jsonparser.jar
添加jar包到classpath中
hive>add jar /上传后jar包所在/jsonparser.jar(jar包名称);
命令创建函数关联java类
hive> create temporary------临时
hive>function myjson
hive>as 'cn.edu360.hive.udf.JsonParser'-----java类的全路径名(在eclipse中可以得到);
例如:
/*
有如下json数据:rating.json
{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}
{"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"}
{"movie":"914","rate":"3","timeStamp":"978301968","uid":"1"}
{"movie":"3408","rate":"4","timeStamp":"978300275","uid":"1"}
*/
需要导入hive中进行数据分析
create table t_rate
as
select myjson(json(表名),1) as movie,cast(myjson(json,2) as int) as rate,myjson(json,3) as ts,myjson(json,4) as uid from t_ratingjson;
可用于简单json的解析
create table 新表名 as
select json_tuple(json字段的字段名,'json内容中的key值1','json内容中的key值2','json内容中的key值3',......)
[as('key值别名1','key值别名2','key值别名3')]
from 表名;