目前,我在單節點 Hadoop 上作業,我寫了一份作業來輸出一個排序的資料幀,其中只有一個磁區到一個 csv 檔案。我發現了以不同方式使用重新磁區時的幾種結果。
一開始我是orderBy先對資料進行排序,然后再repartition輸出一個CSV檔案,但是輸出是分塊排序,而不是整體排序。
然后,我嘗試丟棄repartition函式,但輸出只是記錄的一部分。我意識到不使用repartitionspark 會輸出 200 個 CSV 檔案而不是 1 個,即使我正在處理一個磁區資料幀。
因此,我接下來要做的是將repartition(1), repartition(1, "column of partition"),repartition(20)函式放在orderBy. 然而,200 個 CSV 檔案的輸出保持不變。
所以我coalesce(1)之前用過這個功能orderBy,問題解決了。
我不明白為什么在單個磁區資料幀上作業必須使用repartition和coalesce,以及上述程序如何影響輸出。如果有人可以詳細說明一下,不勝感激。
uj5u.com熱心網友回復:
Spark 在此處有相關引數:
spark.sql.shuffle.partitions和spark.default.parallelism。當您在您的情況下執行排序等操作時,它會觸發稱為隨機播放操作的內容
https://spark.apache.org/docs/latest/rdd-programming-guide.html#shuffle-operations
這會將您的資料幀拆分為spark.sql.shuffle.partitions磁區。
我也和你一樣遇到了同樣的問題,但沒有找到任何優雅的解決方案。
uj5u.com熱心網友回復:
Spark 通常沒有很好的有序資料概念,因為您的所有資料都分布在多個磁區中。每次您呼叫需要 shuffle 的操作時,您的順序都會改變。
出于這個原因,您最好只在 spark 中為真正需要的操作對資料進行排序。
當資料集變大時,將資料強制放入單個檔案會中斷
正如 Miroslav 指出的,每次觸發所謂的 shuffle 階段(這就是分組或加入或視窗操作之類的事情)時,您的資料都會在磁區之間進行混洗
在 group by 操作之前呼叫 repartition 是沒有意義的,因為 spark 需要再次修復您的資料以執行 groupby
合并操作有時會被火花推入洗牌階段。所以也許這就是它奏效的原因。要么是因為您在 groupby 操作后呼叫了它
了解您的查詢發生了什么的一個好方法是開始使用 spark UI - 它通常可在 http://localhost:4040 獲得更多資訊在這里https://spark.apache.org/docs/3.0.0-preview /web-ui.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316038.html
