实现一个功能,拼接字符串,传入的第一个参数是分隔符
my_concat_ws(",",f1,f2,f3)
结果f1,f2,f3
spark代码
package cn._51doit.day12
import org.apache.spark.sql.functions.expr
import org.apache.spark.sql.{Dataset, SparkSession}
/**自定义函数(非聚合函数)
* @Auther Zhang
* @Date 2020/8/21
*/
object UDFDemo1 {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName(this.getClass.getCanonicalName)
.master("local[*]").getOrCreate()
import spark.implicits._
val df = spark
.createDataset(List(("山东省", "烟台市", "蓬莱区"), ("辽宁省", "大连市", "开发区"), ("广东省", "深圳市", "福田区")))
.toDF("province", "city", "district")
df.createTempView("v_location")
/* val res = spark.sql("select concat_ws(',',province,city,district) location from v_location")
res.show()*/
val func = (split: String, province: String, city: String, district: String) => {
province+split+city+split+district
}
spark.udf.register("MY_CONCAT_WS",func)
//SQL风格
/*val res = spark.sql("select my_concat_ws(',',province,city,district) location from v_location")
res.show()*/
//DSL风格
df.select(
expr("my_concat_ws(',',province,city,district)") as("location")
).show()
}
}
上述代代码中最关键的一行
spark.udf.register("MY_CONCAT_WS",func)
上面的spark类型是SparkSession,调用它的udf方法,再调用register方法,注册一个自定义函数,传入两个参数,函数名字和函数的逻辑
MY_CONCAT_WS就是函数的名字,func是函数的逻辑(本身就是一个function)
注意:如果是自定义聚合函数,就不能直接传入一个function了,需要继承Aggregator类,然后重写父类的方法。