簡體   English   中英

spark中partitionBy和groupBy有什么區別

[英]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.

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