Spark SQL操作之-自定义函数篇-下
环境说明
1. JDK 1.8
2. Spark 2.1
自定义函数分类
不同的业务需要不同的处理函数,所以spark也支持用户自定义函数来做专用的处理。这里的自定义函数分两大类:用户已定义函数(UDF)和用户自定义聚合函数(UDAF)。
用户自定义函数(UDF)
用户自定义函数比较简单,写起来就是个普通的scala函数,只不过在spark中使用的时候需要单独注册一下。
直接看例子吧。
scala> val df=Range(0,10).toSeq.toDF("id")
df: org.apache.spark.sql.DataFrame = [id: int]
scala> df.show
+---+
| id|
+---+
| 0|
| 1|
| 2|
| 3|
| 4|
| 5|
| 6|
| 7|
| 8|
| 9|
+---+
##定义一个函数,对给定的整数列都加100
scala> def add100(value:Int):Int = { value + 100 }
add100: (value: Int)Int
##注册成自定义sql函数
scala> spark.udf.register("add100", add100(_:Int))
res1: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,IntegerType,Some(List(IntegerType)))
##调用上面写的自定义函数add100(value:Int)
scala> df.selectExpr("id", "add100(id) as new_id").show
+---+------+
| id|new_id|
+---+------+
| 0| 100|
| 1| 101|
| 2| 102|
| 3| 103|
| 4| 104|
| 5| 105|
| 6| 106|
| 7| 107|
| 8| 108|
| 9| 109|
+---+------+
要注意的是,用spark.udf.register注册的函数,不能用作dataset的函数使用。需要用udf类重新注册一下。
##直接用的话,会类型不匹配的。
scala> df.select(add100($"id")).show
<console>:28: error: type mismatch;
found : org.apache.spark.sql.ColumnName
required: Int
df.select(add100($"id")).show
##正确用法,用udf注册
scala> val add100_func=udf(add100 _)
add100_func: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,IntegerType,Some(List(IntegerType)))
现在相当于有了一个add100_func的函数,类型是UserDefinedFunction
scala> df.select($"id", add100_func($"id").as("new_id")).show
+---+------+
| id|new_id|
+---+------+
| 0| 100|
| 1| 101|
| 2| 102|
| 3| 103|
| 4| 104|
| 5| 105|
| 6| 106|
| 7| 107|
| 8| 108|
| 9| 109|
| 10| 110|
| 11| 111|
| 12| 112|
| 13| 113|
+---+------+
好了,UDF就说到这,挺简单的。下面的UDAF比较起来,复杂多了。
用户自定义聚合函数(UDAF)
和UDF比起来,就多了一个A:聚合,Aggregation。其实聚合函数很常见,平时写SQL,求和啊,求