我在Spark中使用python进行以下map reduce练习时出现问题。 我的map函数返回以下RDD。
rdd = [(3,({0:[2],1:[5],3:[1]},设置([2]))),
(3,({0:[4],1:[3],3:[5]},设置([1]))),
(1,({0:[4,5],1:[2]},设置([3)))]
我写了一个reducer函数,它应该对具有相同键的元组进行一些计算(在前面的例子中,前两个键具有key = 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平台,老实说,这是一个无法调试的噩梦,有时甚至不是“打印”工作。在这种环境中工作真的很令人沮丧。
答案 0 :(得分:0)
如果您想根据相同的密钥减少RDD,则应使用reduceByKey
代替reduce
转换。替换函数名称后,您应该考虑到reduceByKey
函数的参数是值(k[1]
和v[1]
),而不是整个rdd行。
在reducer函数中打印reducer函数将无法在数据驱动程序的分布式环境中工作,因为此函数在执行程序(亚马逊云内部)中进行评估。如果你在本地模式下启动spark,那么所有的python打印都可以工作(但是我不确定databricks上是否有本地模式)。