> 文档中心 > Spark中 UDF的使用

Spark中 UDF的使用

Spark提供了多种解决方案来应对复杂挑战, 但是我们面临了很多场景, 原生的函数不足以解决问题。因此,Spark允许我们注册自定义函数(User-Defined Functions, 或者叫 UDFs)。

SparkSQL中可以创建自定义函数UDF对dataframe进行操作,UDF是一对一的关系,用于给dataframe增加一列数据的场景。 每次传入一行数据,该行数据可以是一列,也可以是多列,进行一顿操作后,最终只能输出该新增列的一个值。
Spark支持多种语言,比如Python, Scala, Java, R, SQL. 但是通常数据操作都是用PySpark或者Spark Scala写的。

接下来说一下 udf函数的 两种注册方式:udf() 和 register()

UDF函数有两种注册方式:- spark.udf.register()  // spark是SparkSession对象  - udf()  // 需要import org.apache.spark.sql.functions._
//生成spark对象val spark = SparkSession.builder()  .master("local[2]")  .appName("testUdf")  .config("spark.driver.memory", "1g")  .config("spark.executor.memory", "2g")  .config("spark.cores.max", "2")  .enableHiveSupport()  .getOrCreate()spark.sparkContext.setLogLevel("warn")// 构造测试数据,有两个字段、名字和年龄val userData = Array(("A", 16), ("B", 21), ("B", 14), ("B", 18))import spark.implicits._//创建测试dfval userDF = spark.createDataFrame(userData).toDF("name", "age")// 注册一张user表userDF.registerTempTable("user")

注册方式一: 调用sqlContext.udf.register()
此时注册的方法 只能在sql()中可见,对DataFrame API不可见
用法:

    spark.udf.register("strLen", (str: String) => str.length())    spark.sql("select name,strLen(name) as name_len from user").show()

注册方式二:调用spark.sql.function.udf()方法
此时注册的方法,对外部可见

用法:

import org.apache.spark.sql.functions._val ageThaner = udf((age:Int,bigger:Int) => age<bigger)val r = spark.sql("select * from user")r.filter(ageThaner($"age", lit(20))).show()

 

 

 

 

https://www.cnblogs.com/yyy-blog/p/10280657.html