对 map reduce 中 Reduce 函数的行为感到困惑

Confused about the behavior of Reduce function in map reduce

我在使用 python 在 Spark 中执行以下地图缩减练习时遇到问题。 我的映射函数 returns 下面的 RDD。

rdd = [(3, ({0: [2], 1: [5], 3: [1]}, set([2]))),
(3, ({0: [4], 1: [3], 3: [5]}, set([1]))),
(1, ({0: [4, 5], 1: [2]}, set([3)))]

我编写了一个 reducer 函数,它应该对具有相同键的元组进行一些计算(在前面的示例中,前两个键的键 = 3,最后一个键是 1)

def Reducer(k, v):
 cluster = k[0]
 rows = [k[1], v[1]]
 g_p = {} 
 I_p = set()
 for g, I in rows:
     g_p = CombineStatistics(g_p, g)
     I_p = I_p.union(I)
 return (cluster, [g_p, I_p]) 

问题是我期望 k 和 v 将始终具有相同的密钥(即 k[0]==v[0])。但是这段代码不是这样的。

我在 Databricks 平台上工作,老实说,无法调试是一场噩梦,有时甚至 'print' 都无法正常工作。在这种环境下工作真的很郁闷

如果你想减少基于相同键的 RDD,你应该使用 reduceByKey 而不是 reduce 转换。替换函数名称后,您应该考虑到 reduceByKey 函数的参数是值(在您的情况下为 k[1]v[1]),而不是整个 rdd 行。

在 databricks 的分布式环境中,reducer 函数内部的打印将不起作用,因为此函数是在执行程序(亚马逊云内部)上评估的。如果您在本地模式下启动 spark,所有 python 打印都将工作(但我不确定本地模式是否在数据块上可用)。