У меня есть 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 дают одинаковый результат, и элементы находятся в одном разделе.