2017-01-16 2 views
0

У меня есть ниже RDD набор данных:как заказать свечи RDD на основе двух столбцов

ABC [G4, G3, G1] 3 
FFF [G5, G4, G3] 3 
CDE [G5,G4,G3,G2] 4 
XYZ [G4, G3] 2 

нужно сортировать по последнему алфавиту колонке первым, если последний столбец такой же, порядок в кулаке кортеж элемента порядка по убыванию , ожидаемый результат:

CDE [G5,G4,G3,G2] 4 
FFF [G5, G4, G3] 3 
ABC [G4, G3, G1] 3 
XYZ [G4, G3] 2 

благодарит заранее.

ответ

2

Вы можете использовать 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)) 
+0

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 правильно, но не корректно по первому элементу массива. –

+0

Привет Феникс/Мтото, спасибо за помощь. Поскольку я действительно новичок в Spark. Я думаю, что я правильно объяснил это, это результат другого процесса. Я открыл еще один поток для quesiton. не могли бы вы помочь мне через ссылку ниже: http://stackoverflow.com/questions/41681804/how-to-order-rdd-with-two-columns. спасибо за помощь. –

+0

Что вам нужно сделать, так это поделиться воспроизводимым примером вашего набора данных, новый связанный с ним вопрос по сути такой же, как и этот. Вероятно, проблема состоит в том, что ваш второй столбец длинной строки, вам нужно сначала преобразовать это в массив, затем выше будет работать. – mtoto

0

Я не знаю, почему выше ответ не работает. Это выглядит хорошо для меня. Просто попробуйте этот код. Вот мой вход

i1,array1,10 
i5,array2,50 
i4,array3,20 
i2,array4,20 

Код:

val idRDD = sc.textFile(inputPath) 

val idSOrted = idRDD.map { rec => ((rec.split(",")(2),rec.split(",")(0)),(rec.split(",")(1))) }.sortByKey(false).map(rec=>(rec._1._1,rec._2,rec._1._2)) 

Вот о/р:

(50,array2,i5) 
(20,array3,i4) 
(20,array4,i2) 
(10,array1,i1) 

Принять решение, если оно работает.

Смежные вопросы