SparkSQL用户自定义函数UDF和UDAF、UDTF

  • 实操
    执行UDF
  def main(args: Array[String]): Unit = {
    val path = "C:/java/spark_practise/src/main/resources/input/people.json"
    val spark = SparkSession.builder().appName("SparkSessionTest").master("local[2]").getOrCreate()
    import spark.implicits._

    // 直接读取文件
    val df = spark.read.json(path)

    // 展示数据
    df.show()

    // dataFrame是有Schema地
    df.printSchema()

    // 创建临时表
    df.createOrReplaceTempView("df")

    // 执行SQL
    spark.sql("select * from df").show()

    // 注册UDF
    spark.udf.register("addName", (x:String) => "Name:"+x)

    // 执行UDF
    spark.sql("select *, addName(name) from df").show()

    spark.stop()
  }

输出结果

+---+--------+-----------------+
|age|    name|UDF:addName(name)|
+---+--------+-----------------+
| 30|zhangsan|    Name:zhangsan|
| 31|    lisi|        Name:lisi|
| 32|  wangwu|      Name:wangwu|
| 32|     sid|         Name:sid|
+---+--------+-----------------+
  • UDF和UDAF的区别
    UDF(User Defined Functions) 是普通的不会产生 Shuffle 不会划分新的阶段的用户自定义函数,UDAF(User Defined Aggregator Functions) 则会打乱分区,用户自定义聚合函数。UDTF(User-Defined Table-Generating Functions)表生成函数,一进多出。


  • 用户自定义函数也可以是官方定义的函数

  • 强弱类型UDAF的区别
    计算中间结果可不可以用实际的类型进行操作,弱类型只能用0、1、2等指定对于的属性,而强类型可以用实际的字段和类型。

更多的强弱类型的UDAF可以看下面的参考资料

参考资料:
Spark系列--SparkSQL(五)用户自定义函数

你可能感兴趣的:(SparkSQL用户自定义函数UDF和UDAF、UDTF)