簡體   English   中英

使用檢查點數據幀覆蓋表失敗,出現FileNotFoundException

[英]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等,但是我對此感到困惑。 我該如何解決這個錯誤?

對於轉換后的輸入為新輸出的此類操作,我會非常小心。 這樣做的原因是,如果發生任何錯誤,您可能會丟失數據。 假設您的轉換邏輯有錯誤,並且生成了無效數據。 但是您只在一天后看到了。 此外,要修復該錯誤,您不能使用剛剛轉換的數據。 轉換之前需要數據。 您如何做才能使數據再次一致?

一種替代方法是:

  • 展示觀點
  • 在每個批次中,您都在編寫一個新表,最后只用該新表替換視圖
  • 幾天后,您還可以計划清潔工作,該工作將刪除最近X天的表格

如果您想繼續使用解決方案,為什么不簡單地這樣做而不是處理檢查點呢?

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.

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