2016-11-23 115 views
0

我有一個Spark SQL DF,其中我嘗試調用一個UDF [我使用Spark SQL創建的udf在Spark SQL DataFrame中調用UDF方法中的其他方法/變量

val udfName = udf(somemethodName) 
val newDF = df.withColumn("columnnew", udfName(col("anotherDFColumn")) 

我試圖使用存儲爲val的somemethodName內的另一個DF,但DF即將爲空。

只有當我使用newDF中的where子句時纔會發生這種情況。

我錯過了什麼嗎?UDF方法中不可能使用其他變量/方法嗎?

或者我必須做廣播嗎?目前我正在本地運行,而不是在羣集中運行。

回答

1

是沒可能使用另一個變量/方法UDF方法內

可能當且僅當該變量/方法可以系列化 - 一個UDF是一個閉包必須被序列化並分發給執行者。

一個數據幀不能被序列化(這是一個指向其它分佈式數據,所以有連載它沒有收集成駕駛員記憶功能不符合邏輯的方式),當您嘗試使用UDF因此出現null

您可能需要join某些關鍵字上的兩個數據框,然後使用UDF(或標準轉換),該UDF從連接的Dataframe中獲取列。

+1

實際上'Dataset' /'Dataframe'可以被序列化。只是不能用於UDF封閉。 – 2016-11-23 17:37:03

+0

@Tzach Zohar:數據框之間沒有公共密鑰,所以我無法加入,另一個數據框只是一個查找文件,有一些範圍值,如0到60等。我如何使用UDF內的查找?我希望我可以讀取UDF方法內的查找文件,但對於我需要加載整個文件的每一條記錄... – Shankar

+0

@LostInOverflow:我可以使用在UDF方法名稱之外定義的列表嗎?我正打算從文件中讀取範圍並創建一個列表,然後使用UDF方法中的列表..它會工作嗎? – Shankar

相關問題