Apache火花工作掛由於不確定的自定義UDF

學習做什麼當你的Apache火花工作掛由於不確定的自定義UDF。

寫的亞當Pavlacka

去年發表在:2022年5月10日

問題

有時Apache火花崗位掛無限期的不確定性行為引發用戶定義函數(UDF)。這是這樣一個函數的一個例子:

% scala val convertorUDF = (commentCol: String) = > {# UDF定義}val translateColumn = UDF (convertorUDF)

如果你調用這個UDF使用withColumn ()API,然後應用一些過濾轉換結果DataFrameUDF可以執行多次,每條記錄,影響應用程序的性能。

% scala val translatedDF = df。withColumn (“translatedColumn translateColumn (df (“columnToTranslate”))) val filteredDF = translatedDF.filter (! translatedDF (“translatedColumn”)。包含(“無效的URL提供”))& & ! translatedDF (“translatedColumn”)。包含(“無法連接到微軟”API))

導致

有時一個確定性UDF可以表現nondeterministically,執行重複調用取決於UDF的定義。你經常看到這種行為,當你使用一個UDF DataFrame添加一個額外的列使用withColumn ()API,然後應用轉換(過濾器)產生的DataFrame

解決方案

udf必須是確定的。由於優化,重複調用可能被淘汰或函數可以調用多次出現在查詢。

更好的選擇是緩存DataFrame你在哪裏使用UDF。如果DataFrame包含大量的數據,那麼拚花格式文件的寫法是最優的。

您可以使用下麵的代碼緩存結果:

% scala val translatedDF = df。withColumn (“translatedColumn translateColumn (df (“columnToTranslate”))) .cache ()