![](/img/trans.png)
[英]How does the number of partitions affect `wholeTextFiles` and `textFiles`?
[英]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),考慮到這一點,我有兩個問題-
如果我執行df.repartition("domain")
,並且一個分區不能容納特定域密鑰的所有數據,那么應用程序會失敗還是會根據數據自動創建合適的分區?
假設在上面的數據中已經基於域密鑰進行了重新分區,所以將存在兩個分區(唯一的密鑰是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.