混淆了地图中Reduce函数的行为减少

时间:2017-01-07 10:35:59

标签: python-2.7 apache-spark mapreduce pyspark databricks

我在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平台,老实说,这是一个无法调试的噩梦,有时甚至不是“打印”工作。在这种环境中工作真的很令人沮丧。

1 个答案:

答案 0 :(得分:0)

如果您想根据相同的密钥减少RDD,则应使用reduceByKey代替reduce转换。替换函数名称后,您应该考虑到reduceByKey函数的参数是值(k[1]v[1]),而不是整个rdd行。

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