2016-09-23 39 views
1

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

// 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

但是,这是一个可靠的方法吗?

这是不可靠的。它取决于假设在洗牌过程中数据按分区顺序定义的顺序进行处理。这可能发生,但不能保证它会发生。

换言之,基于shuffle的排序并不稳定。一般来说,有些方法可以用来达到预期的结果,而不用两次完全洗牌,但这些方法都很低,为了达到最佳性能,需要定制Partitioner

2

您可以通过以下方式

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

两个排序,会一气呵成发生使用sortBy

+0

但为此,我想你将不得不定义排序变量如何排序类型的(A,B)。没有?可能还有其他方法,但是我的问题与我正在使用的方法有关,如果那个方法可靠的话。 – pythonic