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();
}
}