使用Spark中的join进行二级排序?

时间:2016-09-23 08:04:58

标签: scala sorting apache-spark rdd

在Spark中,我想通过两个不同的字段对RDD进行排序。例如,在这里的给定示例中,我想首先按fieldA对元素进行排序,然后在其中按fieldB排序(二级排序)。给定示例中使用的方法是否足够好?我测试了我的代码并且它有效。但这是一种可行的方法吗?

// x is of type (key, fieldA) and y of type (key, fieldB) 
val a = x.sortBy(_._2)
// b will be of type (key, (fieldB, fieldA))
val b = y.join(x).sortBy(_._2._1))

所以,我想要一个类似于下面的输出,例如。

fieldA, fieldB
2, 10 
2, 11
2, 13
7, 5
7, 7
7, 8
9, 3
9, 10
9, 10

2 个答案:

答案 0 :(得分:2)

您可以通过以下方式使用sortBy

y.join(x).sortBy(r => (r._2._2, r._2._1))

一次性完成两次排序。

答案 1 :(得分:2)

  

但这是一种可靠的做法吗?

不可靠。它取决于在随机数据处理期间按照分区顺序定义的顺序进行处理的假设。这可能会发生,但不能保证会发生。

换句话说,基于shuffle的排序不稳定。通常,存在可用于实现期望结果而无需执行两次完全混洗的方法,但这些方法的级别非常低,并且为了获得最佳性能,需要自定义Partitioner