Вы можете использовать sortBy
:
rdd.sortBy(r => (r._3, r._2(0)), false)
В приведенном выше описании r._3
стойки для последнего столбца, r._2(0)
для первого элемента второго столбца (который представляет собой массив), и false
указывает, что порядок должен спускаться. Имейте в виду, что сортировка - дорогостоящая операция из-за перетасовки.
Update
Вот воспроизводимый пример, если мы предполагаем, что вы начинаете с pair rdd
:
/// Generate data
val rdd = sc.parallelize(Seq(("ABC","G4"),("ABC","G3"),
("ABC","G1"),("FFF","G5"),
("FFF","G4"),("FFF","G3"),
("CDE","G5"),("CDE","G4"),
("CDE","G3"),("CDE","G2"),
("XYZ","G4"),("XYZ","G3")))
/// Put values in a list and calculate its size
val rdd_new = rdd.groupByKey.mapValues(_.toList).map(x => (x._1, x._2, x._2.size))
/// Now this works
rdd_new.sortBy(r => (r._3, r._2(0)), false).collect()
/// Array[(String, List[String], Int)] = Array((CDE,List(G5, G4, G3, G2),4), (FFF,List(G5, G4, G3),3), (ABC,List(G4, G3, G1),3), (XYZ,List(G4, G3),2))
Mtoto, я попробовал, но результат выглядит не совсем так, как ожидалось. (CDE \t, [\t G5, \t G4, \t G3, \t G2], 4) (ABC \t, [\t G4, \t G3, \t G1], 3) (FFF \t, [\t G5, \t G4, \t G3], 3) (XYZ \t, [\t G4, \t G2], 2). он упорядочивает по последнему столбцу desc правильно, но не корректно по первому элементу массива. –
Привет Феникс/Мтото, спасибо за помощь. Поскольку я действительно новичок в Spark. Я думаю, что я правильно объяснил это, это результат другого процесса. Я открыл еще один поток для quesiton. не могли бы вы помочь мне через ссылку ниже: http://stackoverflow.com/questions/41681804/how-to-order-rdd-with-two-columns. спасибо за помощь. –
Что вам нужно сделать, так это поделиться воспроизводимым примером вашего набора данных, новый связанный с ним вопрос по сути такой же, как и этот. Вероятно, проблема состоит в том, что ваш второй столбец длинной строки, вам нужно сначала преобразовать это в массив, затем выше будет работать. – mtoto