我有一个四行数据框,使用相同的键,如下所示:
row_no id age time
1 abc 70 1524299530
2 abc 69 1524299528
3 abc 68 1524299526
4 abc 67 1524299524
然后我尝试在此数据框上调用reduceByKey
,如下所示:
new_rdd = df.rdd \
.map(lambda row: (row['id'], [row['age'], row['time']])) \
.reduceByKey(some_reducer)
在some_reducer
中,为了测试,我只返回上一个obj。我使用print
来跟踪reducer的调用,发现spark已经调用了reducer四次,即(1, 2), (3, 4), (1, 3) and (1, 3)
。基本上,减速器在第1行和第3行被调用两次。我用4个处理器在本地运行spark。我还尝试在这个工作上用1个处理器运行spark,并且(1, 2), (3, 4) and (1, 3)
上的reducer被调用了三次。它必须与spark如何对数据进行分区有关,但仍然难以理解这种行为。有人可以为这种行为提供解释吗?
更新:我通过在每一行上添加一个额外的整数列并使reducer成为lambda a, b: a + b
来进行更具建设性的测试。我清楚地观察到,当使用多处理器模式运行时,spark会进行四次添加:1 + 1
,1 + 1
,2 + 2
和2 + 2
。但是,最终结果仍然是4.在某种程度上,spark丢弃了2 + 2
的重复减少。问题是为什么首先出现重复减少以及火花如何处理它们?