lit*_*ely 3 python apache-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())
Run Code Online (Sandbox Code Playgroud)
有 rdd2 和 rdd3 以不同的形式计算,并且我得到相同的结果,但我不确定 rdd2 和 rdd3 是否得到相同的结果并且元素位于同一分区中。
partitionBy 通常意味着您要散列分区键并将它们发送到 RDD 的特定分区。这会将具有匹配键的任何内容并置到同一分区中,这在需要将所有匹配键放在同一位置的联接时非常有用。partitionBy 不会丢弃任何记录,它只会并置匹配的键。
\n\n\n\n\ndf.partitionBy("vendorId") // 保留的所有行现在都位于同一个 rdd 分区中
\n
groupBy 是一个 SQL 概念。如果找到该键的所有唯一组合键。您还可以使用相同的键对所有记录执行聚合函数。例如,如果您想计算具有相同键的所有记录,您可以这样做......
\n\n\n\n\ndf.groupBy("vendorId").count.show
\n
这将计算具有相同供应商 ID 的所有记录。与partitionBy不同,groupBy往往会大大减少记录数量。(参见基数)
\n\n我建议运行 df.groupBy("vendorId").explain(true)。这将打印出逻辑计划(认为 SQL 等效)和物理计划(spark 将执行的确切操作集)。一般来说,spark 将 groupBy 转换为部分哈希聚合 -> shuffle(by key 分区) -> 最终哈希聚合 \xe2\x80\x93> 结果
\n| 归档时间: |
|
| 查看次数: |
8401 次 |
| 最近记录: |