我正在编写MapReduce应用程序,以在两个表上进行归约方联接(其中一个航班具有目标机场ID外键,而一个机场ID映射到其名称)。
在地图之后,两个数据集都将使用一种自定义的CompositeKey格式(airportID,datasetIndicator),其中,datasetIndicator = 0表示机场数据集,1表示航班数据集。
然后,我将仅使用密钥的airportID部分对对进行划分,以确保具有相同airportID的所有对都到达相同的Reducer。
使用自定义GroupComparator,我将确保在单个reduce调用中处理所有具有相同airportID的对。
现在,以简化的方式,我希望第一对值包含机场名称。
对于总键排序,我先比较datasetIndicator,然后比较airportID,但这会产生不正确的结果。由于某些原因,所有机场都会接到自己的reduce呼叫,而没有任何关联的航班。
只需在CompositeKey中反转字段比较顺序即可解决此问题。我不太明白为什么。
我假设完成GroupComparator后,对每个组中的对进行了总键排序,因此,由于此处所有的airportID都相同,因此应该出现对(airportID,0)(其中包含名称作为其值)顶部,与字段比较顺序无关。
不是。似乎机场对和航班对甚至没有在同一个reduce通话中在一起。
唯一的代码更改是CompositeKey的compareTo()字段比较顺序。
分组阶段的结果是否隐含地依赖于分区中对的顺序?