Sparksql的UDF(自定义函数)---完成你实现不了sql语句(初篇一)
- UDF
User Define Function, 用户自定义函数,简称UDF,存在与很多组件中
- 现在由于项目的需要,开始引用Spark技术,其中的SparkSql组件是其核心组件之一,在Spark1.1版本的时候,Spark推出了Uer Define Function功能,用户可以在Spark SQL 里自定义实际需要的UDF来处理数据
- 相信在使用Sparksql的人都遇到了Sparksql所支持的函数太少了的难处,除了最基本的函数,Sparksql所能支撑的函数很少,肯定不能满足正常的项目使用,UDF可以解决问题
- 废话不多说,本篇讲解如何在java ide中最简单实现udf,更详细的说明等研究透了些再写写(基于Java的代码实现介绍)
- SparkSql的应用分两步
- 注册
调用API的是SQLContext
JavaSparkContext jsc = new JavaSparkContext(sparkconf); SQLContext jscsql = new SQLContext(jsc);
jscsql 就可以直接调用API方法了
代码实例:
JavaSparkContext jsc = new JavaSparkContext(sparkconf); SQLContext jscsql = new SQLContext(jsc); jscsql.udf().register("concat_odso",new UDF2<String,String,String>(){ public String call(String arg1, String arg2) { return arg2 + arg1; }},DataTypes.StringType);
SQLContext.udf().register(string name,Function)的声明注册模式
Function可以使用UDF1到UDF22/21?,所表达的意思就是几个参数,2代指两个入参,10代指10个入参
return返回的即为UDF<>的最后一个参数,
DataTypes.StringType用于表名返回的格式
DataTypes.StringType/BooleanType/....等等格式
注意要引用的包
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.api.java.UDFX;
- 注册完成后,就会自定义一个函数,函数的名字即为你的
register的第一个参数(string name)
- 使用
使用自定义的函数很简单,看成一个自带的函数即可,代码实例如下
DataFrame result01 = jscsql.sql("select concat_odso(t.mdn,t.mdn) from data_evdo t where t.bsid='374E00000BA1'");
concat_odso即为自定义的函数名字,该定义函数实现了查询结果字符串的拼接