問題
有時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 ()