Hive-三种自定义函数-UDF

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 "";
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值