0

我在使用 python 的 Spark 中进行以下地图减少练习时遇到问题。我的 map 函数返回以下 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 平台上工作,老实说,无法调试是一场噩梦,有时甚至无法“打印”工作。在这种环境下工作真的很令人沮丧。

4

1 回答 1

0

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

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

于 2017-01-07T11:13:08.247 回答