2017-04-19 58 views
4

從我所看到的,爲了做到這一點,你必須如何註冊UDF以在SQL和DataFrame中使用?

  1. 使udf作爲一個純函數
  2. SQLContext註冊功能SQL

    spark.sqlContext.udf.register("myUDF", myFunc) 
    
  3. 反過來,這變爲UserDefinedFunction for DataFrame

    def myUDF = udf(myFunc) 
    

有沒有辦法將這一步合併爲一步,並使udf可用於兩個?另外,對於存在DataFrame但不適用於SQL的情況,如何在不復制代碼的情況下注冊它?

回答

8

UDFRegistration.register變型,內搭一件scala.FunctionN,返回一個UserDefinedFunction,所以你可以在一個單一的步驟註冊SQL函數創建DSL友好UDF:

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 
+------+ 
|UDF(x)| 
+------+ 
|  2| 
+------+ 
0

您可以使用以下仍然適用於數據幀

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

在數據幀轉換上調用時使用selectExpr。

df.selectExpr("myUDF(col1) as modified_col1") 
相關問題