任何Spark专家都有奇怪的经验:使用pypark获得不一致的map-reduce结果吗?
假设在中途,我有一个RDD
....
add = sc.parallelize([(('Alex', item1), 3), (('Joe', item2), 1),...])
我的目标是汇总有多少不同的用户,所以
print (set(rdd.map(lambda x: (x[0][0],1)).reduceByKey(add).collect()))
print (rdd.map(lambda x: (x[0][0],1)).reduceByKey(add).collect())
print (set(rdd.map(lambda x: (x[0][0],1)).reduceByKey(add).map(lambda x: x[0]).collect()))
这三个版画应该具有相同的内容(尽管格式不同)。例如,第一个是一组set({('Alex', 1), ('John', 10), ('Joe', 2)...})
;第二个是[('Alex', 1), ('John', 10), ('Joe', 2)...]
的列表。项目数应该等于不同用户的数量。第三个是set({'Alex', 'John', 'Joe'...})
但我得到了set({('Alex', 1), ('John', 2), ('Joe', 3)...})
;第二个是[('John', 5), ('Joe', 2)...]
的列表(' Alex'甚至在此丢失)。集合和列表的长度不同。
不幸的是,如果我只写一个简短的测试代码,我甚至无法重现错误;仍然得到正确的结果。有没有遇到过这个问题?
答案 0 :(得分:0)
我想我想通了。
原因是如果我经常使用相同的RDD,我需要.cache()
。
如果RDD变为
add = sc.parallelize([(('Alex', item1), 3), (('Joe', item2), 1),...]).cache()
然后解决了不一致的问题。
或者,如果我进一步准备聚合的rdd为
aggregated_rdd = rdd.map(lambda x: (x[0][0],1)).reduceByKey(add)
print (set(aggregated_rdd.collect()))
print (aggregated_rdd.collect())
print (set(aggregated_rdd.map(lambda x: x[0]).collect()))
然后也没有不一致的问题。