Spark SQL自定义函数案例(拼接字符串)

实现一个功能,拼接字符串,传入的第一个参数是分隔符

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类,然后重写父类的方法。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值