对 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 打印都将工作(但我不确定本地模式是否在数据块上可用)。
我在使用 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 打印都将工作(但我不确定本地模式是否在数据块上可用)。