SparkSQL中有两种自定函数,在我们使用自带的函数时无法满足自己的需求时,可以使用自定义函数,SparkSQL中有两种自定义函数,一种是UDF,另一种是UDAF,和Hive 很类似,但是hive中还有UDTF,一进多出,但是sparkSQL中没有,这是因为spark中用 flatMap这个函数,可以实现和udtf相同的功能
UDF函数是针对的是一进一出
UDAF针对的是多进一出
udf很简单,只需要注册一下,然后写一个函数,就可以在sql查询中使用了
df1.createTempView("user")
//注册
spark.udf.register("lengthStr",(str:String)=>str.length)//自定义函数
//直接在sql中就可以使用啦
val df2 = spark.sql("select lengthStr(name) from user")
udaf相对来说比较复杂一点,需要继承一个 UserDefinedAggregateFunction类,在重写其中的方法,自定义函数求平均值,详细的步骤在下面的代码中
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.expressions.{
MutableAggregationBuffer, UserDefinedAggregateFunction}
import org.apache.spark.sql.types._
import org.apache.spark.sql.{
DataFrame, Row, SparkSession, types}
object UDAFavg {
def main(args: Array[String]): Unit = {
val spark