簡體   English   中英

為什么 PySpark 代碼在訪問 dataframe 時掛起一段時間然后突然終止

[英]Why PySpark code hangs for a while and then terminates abruptly while accessing a dataframe

問題陳述:PySpark 程序在根據特定字段不是 NULL 的條件從 dataframe 讀取記錄時掛起。該字段是字符串字段,可能包含也可能不包含字符串值。 對這個字符串字段的任何操作,比如檢查NULL,計算字段長度,都會導致代碼掛起,然后終止。

描述:例如,在我們的例子中,PySpark 程序從文件中讀取數據並加載到 dataframe。名為“ErrorDescription”的新列添加到 dataframe。當任何字段的記錄數據驗證均失敗。 在所有檢查結束時,當讀取 dataframe 以識別“ErrorDescription”字段所在的記錄為 NULL(有效記錄)時,有時活動成功完成,有時程序掛起然后終止。

到目前為止我們所做的:我們試圖通過將 'ErrorDescription' 的初始值定義為 '' 或 "" 而不是 'NULL' 來解決這個問題。 但是,在通過所有數據驗證處理記錄后,每當我們檢查 dataframe 中的“ErrorDescription”為“”或“”或 NULL 時,進程就會掛起並終止。 令人困惑的部分是,記錄是通過多次迭代處理的,對於最初的 2 次迭代,此“ErrorDescription”檢查工作正常,但對於下一次迭代,它會掛起然后終止。 我們修改了代碼以跳過本次迭代並繼續下一次迭代。 代碼再次成功完成前兩次迭代,跳過第三次迭代,成功執行第四次迭代並在第五次迭代中再次掛起並終止。 代碼的行為是完全不合理的。 更令人困惑的是,錯誤 dataframe 是通過檢查父 dataframe 中的錯誤記錄而創建的,方法是檢查 ErrorDescription 是否為 NOT NULL。但是代碼掛在錯誤 dataframe 用於將數據加載到數據庫的階段. 我們一開始以為可能是數據庫層面的問題,后來發現是pyspark懶惰求值導致dataframe只有在訪問加載到數據庫表時才執行的錯誤。

解決方案:為解決此問題,我們定義了一個名為“ErrorFound”的 integer 列以及“ErrorDescription”列,如下所示。

.withColumn("ErrorDescription", lit(""))
.withColumn("ErrorFound",lit(0))

每當在記錄中發現錯誤並使用相關錯誤描述值繼續填充 ErrorDescription 列時,我們將字段 Error_Found 更改為 1。 那么在識別dataframe中的錯誤記錄時,我們檢查的是'ErrorFound == 1',而不是檢查ErrorDescription not equal to NULL or '' or ""。 通過這種方法,所有迭代都成功執行,代碼掛起問題也得到解決。

結論:總而言之,如果您的 pyspark 代碼正在檢查 NULL 值的字符串字段並且代碼掛起並終止,請盡可能切換到使用整數值。 這將解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM