UDF
udf 是一输入一输出
其自定义方法为:
(1)继承 UDF这个类
(2)重写evaluate方法
(3)确定自己的输入参数类型及放回参数类型
代码实现
package com.qqhru.gmall.hive;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.json.JSONObject;
public class MyUDF extends UDF {
//我们此时想要的返回的参数类型为String
//输入参数为一个Json格式的字符串以及我们需要解析的字段值
public String evaluate (String jsonStr,String key){
//判断传入的参数是否符合我们的要求
//1.判断传入参数是否为空
//我们用到的是StringUtils方法里的isBlank方法
if (!StringUtils.isBlank(jsonStr)){
return "";
}
//这里我们使用的是一个京东某商品的评论
/*
1516323325|{
"integral": 80,
"isTop": false,
"nickname": "H***a",
"orderId": 0,
"plusAvailable": 201,
"productColor": "新款成就轻薄商务办公本",
"productSales": "[]",
"productSize": "11代新品|i5 锐炬Xe显卡 512G",
"referenceId": "100016777690",
"referenceName": "戴尔DELL成就3400 14英寸轻薄性能商务全面屏笔记本电脑(11代i5-1135G7 16G 512G)一年上门+7x24远程服务",
"referenceTime": "2021-02-25 00:00:21"
}
*/
//2.拆分字符串因为我们可以看出我们传入的并不是一个真正的json格式将其拆分
/*
split方法传入的是一个re正则表达式
因此我们并不能用”|“来直接进行切分又因为|在正则中有含义
所以我们需要转义\同时我们java中的”\“也是转义的含义
进而我们要想解析|需要”\\|“
*/
String[] split = jsonStr.split("\\|");
String serverTime = split[0];
String json = split[1];
//2.如果不为空则创建一个JSONObject对象用来解析json
JSONObject jsonObject = new JSONObject(json);
if("st".equals(key)){
return serverTime ;
}
if("orderId".equals(key)){
//我们考虑到不是所有的评论信息都是有orderId这个字段
//所以我们要进行一个判断
if (jsonObject.has(key)){
return jsonObject.getString(key);
}
}
//同理依次解析
return "";
}
}
3810

被折叠的 条评论
为什么被折叠?



