场景
UDAF = USER DEFINED AGGREGATION FUNCTION
上一篇文章已经介绍了spark sql的窗口函数,并知道Spark sql提供了丰富的内置函数供猿友们使用,辣为何还要用户自定义函数呢?实际的业务场景可能很复杂,内置函数hold不住,所以spark sql提供了可扩展的内置函数接口:哥们,你的业务太变态了,我满足不了你,自己按照我的规范去定义一个sql函数,该怎么折腾就怎么折腾!
例如,MySQL数据库中有一张task表,共两个字段taskid (任务ID)与taskParam(JSON格式的任务请求参数)。简单起见,这里只列出一条记录:
taskid
1
taskParam
{
"endAge":["50"],"endDate":["2016-06-21"],"startAge":["10"],"startDate":["2016-06-21"]}
假设应用程序已经读取了mysql中这张表的记录,并通过 DateFrame注册成了一张临时表 task。问题来了:怎么获取taskParam中startAge的第一个值呢?
sqlContext.sql("select taskid,getJsonFieldUDF(taskParm,'startAge')")
这个时候,我们就需要自定义一个UDF函数了,取名getJsonFieldUDF。Java版本的代码大致如下:
package cool.pengych.sparker.product;
import org.apache.spark.sql.api.java.UDF2;
import com.alibaba.fastjson.JSONObject;
/**
* 用户自定义函数
* @author pengyucheng
*/
public class GetJsonObjectUDF implements UDF2<String,String,String>
{
/**
* 获取数组类型json字符串中某一字段的值
*/
@Override
public String call(String json, String field) throws Exception
{
try
{
JSONObject jsonObject = JSONObject.parseObject(json);
return jsonObje