在Spark中获取不一致的结果

时间:2017-11-19 23:26:29

标签: pyspark

任何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'甚至在此丢失)。集合和列表的长度不同。

不幸的是,如果我只写一个简短的测试代码,我甚至无法重现错误;仍然得到正确的结果。有没有遇到过这个问题?

1 个答案:

答案 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()))

然后也没有不一致的问题。