2017-03-05 14 views
4

我有這個奇怪的錯誤。我有一個例程,如果它存在(或者另外創建一個),則讀取一個數據幀,修改它,然後以'覆蓋'模式再次以parquet格式將其保存在相同的目標路徑中。FileNotFoundException嘗試將DataFrame保存爲實木複合格式時,使用'覆蓋'模式

在第一次運行時,當沒有數據幀時,我創建一個並保存。它產生在輸出文件夾4個文件:

  • _SUCCESS.crc
  • 部分-R- < .....> snappy.parquet.crc
  • _SUCCESS
  • 部分-R- <。 .....>。snappy.parquet

然後,在第二輪,我讀數據框,修改它,當我嘗試覆蓋它,它拋出一個異常的*part-r-<.....>.snappy.parquet file does not exist*

當發生異常時,輸出文件夾爲空,但在執行df.write.parquet(path, 'overwrite')之前,該文件夾包含此文件。

我試圖將spark.sql.cacheMetadata設置爲'false',但它沒有幫助。 spark.catalog.listTables()返回一個空列表,所以沒有意義刷新任何內容。

現在,我只需刪除輸出文件夾的項目,然後寫入數據幀。有用。但爲什麼「覆蓋」模式的原始方法失敗?

謝謝。

+0

問題是,當你申請savemode作爲覆蓋,然後創建物理計劃後spark刪除目錄,你可以嘗試savemode作爲追加 –

+0

我面臨同樣的問題和保存模式作爲附加也失敗,同時寫入從火花s3 – braj259

回答

1

RDD's不保存數據,如變量,它只是一個數據結構,它知道如何獲取數據(getPartition)以及在調用操作時如何對數據執行轉換(計算)。

所以你在這裏做的,

第1次=> ... =>保存路徑向前=>從通道讀取的
第二次一
=>做一些改造= >保存路徑A有覆蓋模式

現在請注意,您的實際行動是保存於路徑A。利用你調用一個動作,Spark只創建DAG,它知道何時會調用一個動作來查找數據(保存到路徑A),如何轉換它們以及保存/顯示的位置。

但是,當你選擇模式重載時,Spark中的執行計劃將首先刪除路徑,然後嘗試讀取已經空出的路徑。

因此,作爲一種解決方法,您可以將它們保存爲不同的文件夾(如分區基礎),也可以將它們保存在兩個路徑中一個目標和一個tmp。

+0

我是面臨同樣的問題。我所做的是我將它寫入臨時位置,然後從那裏讀取並寫入主要位置。仍然失敗。有什麼想法嗎 ?提前致謝。 – braj259

1

的另一件事情在這裏做的是緩存它 -

df.cache() 

你從HDFS讀取後馬上。

相關問題