- 实操
执行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可以看下面的参考资料