[英]Using checkpointed dataframe to overwrite table fails with FileNotFoundException
我在pySpark中有一些數據框df
,其結果是通過調用:
df = spark.sql("select A, B from org_table")
df = df.stuffIdo
我想在腳本末尾覆蓋org_table
。 由於禁止覆蓋輸入表,因此我對數據進行了檢查:
sparkContext.setCheckpointDir("hdfs:/directoryXYZ/PrePro_temp")
checkpointed = df.checkpoint(eager=True)
現在應該打破沿襲了,我也可以使用checkpointed.show()
查看我的檢查點數據(有效)。 寫表是行不通的:
checkpointed.write.format('parquet')\
.option("checkpointLocation", "hdfs:/directoryXYZ/PrePro_temp")\
.mode('overwrite').saveAsTable('org_table')
這會導致錯誤:
引起原因:java.io.FileNotFoundException:文件不存在:hdfs://org_table_path/org_table/part-00081-4e9d12ea-be6a-4a01-8bcf-1e73658a54dd-c000.snappy.parquet
我已經嘗試過幾件事,例如在編寫之前先刷新org_table等,但是我對此感到困惑。 我該如何解決這個錯誤?
對於轉換后的輸入為新輸出的此類操作,我會非常小心。 這樣做的原因是,如果發生任何錯誤,您可能會丟失數據。 假設您的轉換邏輯有錯誤,並且生成了無效數據。 但是您只在一天后看到了。 此外,要修復該錯誤,您不能使用剛剛轉換的數據。 轉換之前需要數據。 您如何做才能使數據再次一致?
一種替代方法是:
如果您想繼續使用解決方案,為什么不簡單地這樣做而不是處理檢查點呢?
df.write.parquet("hdfs:/directoryXYZ/PrePro_temp")\
.mode('overwrite')
df.load("hdfs:/directoryXYZ/PrePro_temp").write.format('parquet').mode('overwrite').saveAsTable('org_table')
當然,您將讀取兩次數據,但看起來比帶有檢查點的數據更不可靠。 此外,您每次都可以將“中間”數據存儲在不同的目錄中,因此您可以解決我一開始就提到的問題。 即使您有錯誤,也可以通過選擇一個.write.format(...)
目錄並對org_table執行.write.format(...)
來帶來有效的數據版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.