Spark提供大量内置函数供开发者使用,也可以自定义函数使用。
Spark自定义函数步骤:
1、定义函数
2、注册函数
SparkSession.udf.register():只在sql()中有效
functions.udf():对DataFrame API均有效
3、函数调用
1、自定义标准函数(UDF)
在D:\test\t\目录下有文件hobbies.txt,文件内容:
alice jogging,Coding,cooking
lina travel,dance
需求:用户行为喜好个数统计
要求输出格式:
alice jogging,Coding,cooking 3
lina travel,dance 2
import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{
DataFrame, SparkSession}
object SparkUDFDemo {
//样例类
case class Hobbies(name:String,hobbies: String)
def main(args: Array[String]): Unit = {
val spark :SparkSession= SparkSession.builder()
.master("local[1]")
.appName("SparkUDFDemo")
.getOrCreate()
val sc:SparkContext = spark.sparkContext
//需要手动导入一个隐式转换,否则RDD无法转换成DF
import spark.implicits._
val rdd:RDD[String] = sc.textFile("D:\\test\\t\\hobbies.txt")
val df:DataFrame = rdd.map(x=>x.split("\t")).map(x=>Hobbies(x(0),x(1))).toDF()
//df.printSchema()
//df.show()
df.registerTempTable("hobbies")
//注册自定义函数,注意是匿名函数
spark.udf.register("hoby_num",(s:String)=>s.split(",").size)
val frame:DataFrame = spark.sql("select name,hobbies,hoby_num(hobbies) as hobnum from hobbies")
frame.show()
}
}
输出:
+-----+--------------------+------+
| name| hobbies|hobnum|
+-----+----------