簡體   English   中英

在pyspark中的列上重新分區如何影響分區數量?

[英]How does repartitioning on a column in pyspark affect the number of partitions?

我有一個具有一百萬條記錄的數據框。 看起來像這樣-

df.show()

+--------------------+--------------------++-------------
|            feature1|            feature2| domain    |
+--------------------+--------------------++-------------
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain1   | 
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain2   |
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain1   |
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain2   |
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain1   |

理想的分區大小為128 MB,假設domain列具有兩個唯一值(domain1和domain2),考慮到這一點,我有兩個問題-

  1. 如果我執行df.repartition("domain") ,並且一個分區不能容納特定域密鑰的所有數據,那么應用程序會失敗還是會根據數據自動創建合適的分區?

  2. 假設在上面的數據中已經基於域密鑰進行了重新分區,所以將存在兩個分區(唯一的密鑰是domain1和domain2)。 現在,假設domain1和domain2重復了1000000次,我將基於該域進行自聯接。 因此,對於每個域,我將獲得大約10 ^ 12條記錄。 考慮到我們有兩個分區,並且在連接期間分區的數量沒有變化,兩個新分區是否能夠處理1000000條記錄?

答案取決於數據的大小。 當一個分區不能保存屬於一個分區值的所有數據(例如domain1 )時,將創建更多分區,最多spark.sql.shuffle.partitions個分區。 如果您的數據太大,即一個分區將超過2GB的限制(有關說明,另請參見為什么Spark RDD分區HDFS的限制為2GB? ),重新分區將導致OutOfMemoryError
正如提供完整答案的旁注所示:能夠將數據放入一個分區不一定意味着一個分區值只生成一個分區。 除其他因素外,這取決於執行程序的數量以及之前如何對數據進行分區。 Spark將嘗試避免不必要的改組,因此可能會為一個分區值生成多個分區。

因此,為防止作業失敗,您應該調整spark.sql.shuffle.partitions或將所需數量的分區與partition列一起進行repartition分區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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