Flink的UDF函数

ScalarFunction
接收输入一行,输出一行数据;
eval方法里面定义数据处理逻辑;
open与close方法为可选项

import com.alibaba.fastjson.JSONObject;,import Morg.apache.flink.table.functions.FunctionContext;
import org.apache.flink.table.functions.ScalarFunction;

public class JsonParserUdf extends ScalarFunction{
	@Override
	public void open(FunctionContext context){
	}
	
	public String eval(String a,String b){
		String res = null;
		Map<String,String> inputMap = JSONObject.parseObject(a,Map.class);
		res = inputMap.get(b);
		return res;
	}
	
	@Override
	public void close(){}
}

AggregateFunction
聚合函数;
accumulate方法:第一个必须是使用 AggregateFunction 的 ACC 类型的 accumulator,后面的参数为指定的输入。
getValue方法:定义处理逻辑输出。

import org.apahe.flink.table.functionsAggregateFunction;
import java.util.*;
import java.util.stream.Collectors;

public class Collect2KeysUDF<merge> extends AggregateFunction<List<String>,Collect2KeysUDF.CollectTreeSetAcc>{
	@Override
	public List<String> getValue(CollectTreeSetAcc acc){
		Collections.sort(acc.list);
		Collections.reverse(acc.list);
		
		acc.list = acc.list.stream().distinct().collect(Collectors.toList());
		if(acc.list.size()>10){
			acc.list = acc.list.subList(0,10);
		}
		List<String> out = new ArrayList<>(acc.list.size());
		for(String s : acc.list){
			if(s.length()>16) out.add(s.substring(16))
		}
		return out;
	}

	@Override
	public CollectTreeSetAcc createAccumulator(){
		CollectTreeSetAcc acc = new CollectTreeSetAcc();
		return acc;
	}
	
	public void merge(CollectTreeSetAcc acc,Iterable<CollectTreeSetAcc> iy){
		for(CollectTreeSetAcc hll:it){
			acc.list.addAll(hll.list);
		}
	}
	public void accumulate(CollectTreeSetAcc acc,String clm1,String clm2,String clm3){
		if(clm3!=null && clm3.length()>16){
			acc.list.add(clm3.substring(0,16) + clm2 + ":" +clm1)
		}
	}
	public static class CollectTreeSetAcc{
		public List<String> list = new ArrayList();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值