2017-06-29 114 views
0

我在jupyter筆記本上工作,使用spark 2.0.1創建並在python中將節點spark數據框保存爲s3。該代碼看起來像在火花中重複使用s3存儲桶之前,如何正確移除/清除s3存儲桶?

action = 'CREATE' 
if action == 'CREATE': 
    df = dfA.filter(...) 
    df = df.join(...) 
    df.coalesce(4).write.format('parquet').save('s3://my/path') 
elif action == 'LOAD': 
    df = spark.read.parquet('s3://my/path') 

我認爲在某些時候,我有一個bug,並寫了一個DF它曾在其4項(4特定查詢)時,它只能有2個(每一條記錄被複制 - 可能是因爲我在加入某些東西時沒有先刪除它)。

重新工作之後,我可以驗證當我刪除舊的s3:// my/path,然後運行創建邏輯以便它可以寫入位置時,我的df擁有我期望的2個項目。

我感到困惑的是,如果我現在運行LOAD邏輯,它應該加載數據幀,我只是錯了2個項目,用s3替換我的df,我得到一個錯誤的4項目的數據幀它。

如果我用新路徑重新開始,s3://my/path2,那麼這個練習就是創建和加載作品。

這似乎是一個與S3的錯誤,或者可能是火花?

回答

0

它不是一個bug,它可能是s3的行爲,它具有新的對象PUTS的讀寫後一致性,覆蓋PUTS和DELETES對象的最終一致性。當你刪除一個數據並且它可能會出現在列表中一段時間​​,但最終在一段時間刪除完全傳播到所有區域後,它將列出正確的數據。(http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel

0

我喜歡@ madhan-s答案,但是我的覆蓋/重讀都是以交互方式完成的,在aws s3上重新加載頁面,檢查在不存在的時候我無法讀取對象,所以我不確定這是否可以解釋它(但是感謝那個鏈接!我需要學習這種東西!)

東西可能已經發生了,是我認爲我做了

df = make_bad_df() 
df.save_to_s3() 
df = read_from_s3() 
df.persist() 

在這一點上,我會堅持一個數據幀我從一個特定的S3對象讀取 - 如果我當時已經不知道S3對象的方式已經改變了刪除並重新編寫S3存儲桶,而這樣做

df2 = read_from_s3() 

星火,也許火花會說 - 啊哈!我已經堅持這個數據框,我只是從內存/本地磁盤獲得它?

+0

- 不,火花不這樣做。你想保持一個數據集,只保留變量。是的,S3一致性看起來會讓事情變得更糟。 –