实现一个功能,拼接字符串,传入的第一个参数是分隔符
my_concat_ws(",",f1,f2,f3)
结果f1,f2,f3
spark代码
package cn._51doit.day12import org.apache.spark.sql.functions.exprimport org.apache.spark.sql.{Dataset, SparkSession}/**自定义函数(非聚合函数)* @Auther Zhang* @Date /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类,然后重写父类的方法。