0

我正在多節點環境(一個主節點和兩個從節點)上運行apache代碼,我在其中操作數據框,然後對其執行邏輯迴歸。在我之間也寫出臨時轉換的文件。我目睹了一個奇怪的觀察結果(是的,我已經進行了雙重檢查和三重檢查),我無法解釋並且想確認這是否可能是因爲我的代碼或可能存在其他因素。向HDFS寫入數據幀是否會影響其排序

我有一個像

一個數據幀DF

uid rank text 
a 1 najn 
b 2 dak 
c 1 kksa 
c 3 alkw 
b 1 bdsj 
c 2 asma 

我用下面的代碼

sdf = df.orderBy("uid", "rank") 
sdf.show() 

uid rank text 
a 1 najn 
b 1 bdsj 
b 2 dak 
c 1 kksa 
c 2 asma 
c 3 alkw 

排序並用寫的轉化DF到HDFS

sdf.repartition(1) 
    .write.format("com.databricks.spark.csv") 
    .option("header", "true") 
    .save("/someLocation") 

現在,當我再次嘗試查看似乎數據已經失去了它的排序

sdf.show() 
uid rank text 
a 1 najn 
c 2 asma 
b 2 dak 
c 1 kksa 
c 3 alkw 
b 1 bdsj 

當我跳過寫代碼,它工作正常。

任何人都有任何指針,如果這可能是一個有效的情況下,我們可以做些事情來解決它。

P.s.我嘗試了各種各樣的編寫代碼,增加了分區數量,完全刪除了分區並將其保存爲其他格式。

+2

「重新分配」將所有數據抹去並重新排序。否則,順序應該保存在像這樣的簡單輸出格式中。 – zero323

回答

0

問題不在於寫入HDFS,而是在zero323的評論中聲明的重新分區。

如果你計劃什麼都寫下來,以一個單一的文件,你應該做的是這樣的:

sdf.coalesce(1).orderBy(「UID」,「等級」)寫的......

COALESCE避免了重新分區(它只是複製一個分區的其他替代洗牌通過哈希一切後),這將意味着你的數據將仍然是原來的分區中進行排序,並therfore更快的順序(當然你也可以輸原來的訂購,因爲它在這裏沒有多大幫助)。

請注意,這是不可擴展的,因爲您正在將所有內容都拉到單個分區。如果沒有進行任何重新分區,您會遇到錯誤,您將根據sdf的原始分區數獲取多個文件。每個文件都將在內部排序,以便您可以輕鬆地將它們組合。

相關問題