如何注册UDF以在SQL和DataFrame中使用?

时间:2017-04-19 00:25:38

标签: scala apache-spark apache-spark-sql user-defined-functions

从我所看到的,为了做到这一点,你必须

  1. udf设为普通函数
  2. 使用SQLContext为SQL

    注册该函数
    spark.sqlContext.udf.register("myUDF", myFunc)
    
  3. 将其转换为UserDefinedFunction

    DataFrame
    def myUDF = udf(myFunc)
    
  4. 是否无法将此功能合并为一步并使udf可用于两者?另外,对于DataFrame但不存在SQL的函数的情况,如何在不复制代码的情况下注册它?

3 个答案:

答案 0 :(得分:12)

采用var returnedJSON = JSON.parse('[{"name": "jason"}, {"name": "jake"}, {"name": "jill"}]'); var filteredResults = returnedJSON.filter((item) => { return item.name === "jason" }); console.log(filteredResults); // returns {name:"jason"}

UDFRegistration.register变体返回scala.FunctionN,因此您可以在一个步骤中注册SQL函数并创建DSL友好UDF:

UserDefinedFunction
val timesTwoUDF = spark.udf.register("timesTwo", (x: Int) => x * 2)
spark.sql("SELECT timesTwo(1)").show
+---------------+
|UDF:timesTwo(1)|
+---------------+
|              2|
+---------------+
spark.range(1, 2).toDF("x").select(timesTwoUDF($"x")).show

答案 1 :(得分:3)

您可以使用以下内容并仍将其应用于数据框

spark.sqlContext.udf.register("myUDF", myFunc)

在数据帧转换时调用selectExpr。

df.selectExpr("myUDF(col1) as modified_col1")

答案 2 :(得分:1)

Spark2更新-

  

spark.udf.register(“ func_name”,func_name)

参数1-函数名称将在spark中注册

Argument2-函数名称在python / scala中创建时定义的内容

最佳做法是在spark中注册具有相同名称的函数。