![](/img/trans.png)
[英]What's the difference between groupby.first() and groupby.head(1)?
[英]What's the difference between partitionBy and groupBy in spark
我有一個 pyspark rdd 可以收集為如下的元組列表:
rdds = self.sc.parallelize([(("good", "spark"), 1), (("sood", "hpark"), 1), (("god", "spak"), 1),
(("food", "spark"), 1), (("fggood", "ssspark"), 1), (("xd", "hk"), 1),
(("good", "spark"), 7), (("good", "spark"), 3), (("good", "spark"), 4),
(("sood", "hpark"), 5), (("sood", "hpark"), 7), (("xd", "hk"), 2),
(("xd", "hk"), 1), (("fggood", "ssspark"), 2), (("fggood", "ssspark"), 1)], 6)
rdds.glom().collect()
def inner_map_1(p):
d = defaultdict(int)
for row in p:
d[row[0]] += row[1]
for item in d.items():
yield item
rdd2 = rdds.partitionBy(4, partitionFunc=lambda x: hash(x)).mapPartitions(inner_map_1)
print(rdd2.glom().collect())
def inner_map_2(p):
for row in p:
item = row[0]
sums = sum([num for _, num in row[1]])
yield item, sums
rdd3 = rdds.groupBy(lambda x: x[0]).mapPartitions(inner_map_2)
print(rdd3.glom().collect())
有 rdd2 和 rdd3 以不同的形式計算,我得到相同的結果,但我不確定 rdd2 和 rdd3 是否得到相同的結果並且元素在同一個分區中。
partitionBy 通常意味着您將 hash 分區鍵並將它們發送到 RDD 的特定分區。 這會將具有匹配鍵的任何內容並置到同一分區中,這在您需要所有匹配鍵位於同一位置的連接時很有用。 partitionBy 不會丟棄任何記錄,它只會將匹配的鍵放在一起。
df.partitionBy("vendorId") // 所有行保留它們現在位於同一個 rdd 分區中
groupBy 是一個 SQL 概念。 如果找到鍵的所有唯一鍵組合。 您還可以對具有相同鍵的所有記錄執行聚合函數。 例如,如果您想用相同的鍵計算所有記錄,您可以這樣做......
df.groupBy("vendorId").count.show
這將計算具有相同供應商 ID 的所有記錄。 與 partitionBy 不同,groupBy 往往會大大減少記錄數。 (見基數)
我建議運行 df.groupBy("vendorId").explain(true)。 這將打印出邏輯計划(想想 SQL 等效項)和物理計划(spark 將執行的確切操作集)。 一般來說,spark 將 groupBy 轉換為部分 hash 聚合 -> shuffle(按鍵分區) -> 最終 hash 聚合 -> 結果
我會說“groupBy”是一種更合乎邏輯的數據分組方式。 它看起來像 SQL 中的“groupBy”。
“PartitionBy”更具物理性。 您實際上在集群中對數據進行了物理分區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.