我在以下地图上遇到问题,使用Python减少了Spark中的运动。我的地图函数返回以下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平台上工作,说实话,这是无法调试的噩梦,有时甚至无法进行“打印”工作。在这种环境下工作真让人沮丧。
如果要基于相同的密钥减少RDD,则应使用reduceByKey
而不是reduce
转换。替换函数名后,你应该考虑到的参数的reduceByKey
函数是值(k[1]
和v[1]
你的情况),而不是整个RDD行。
reducer函数内部的打印在数据块上的分布式环境中将不起作用,因为此函数是在执行程序(在亚马逊云内部)上评估的。如果您在本地模式下启动spark,则所有python打印都可以工作(但是我不确定databricks上是否可以使用本地模式)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句