Как отсортировать по ключу, приведенному groupByKey в Spark - PullRequest
0 голосов
/ 25 апреля 2018

Нужна помощь в сортировке по ключу после вывода groupByKey:

val skuRDD2:RDD[(String,Iterable[(String,imageinfo2))]= DF.select("ID", "TAG","MEDIA_ID","IMAGE_NAME","PATH").rdd
            .map(r => (r .getString(0),( r.getString(1),ImageInfo2(r.getString(2),r.getString(3),r.getString(4)))) )
      .groupByKey()

Я хочу отсортировать по TAG, т.е.введите Iterable [(String, imageinfo2)) в вышеприведенном выводе groupByKey.

Ввод (выше вывода groupByKey) -

(skuid,Map(largeImage_4 -> [Media/Device Images/Large Images/Huawei Images Large/GR5GRY-4,m110005,GR5GRY-4], largeImage_1 -> [Media/Device Images/Large Images/Huawei Images Large/GR5GRY-1,m110002,GR5GRY-1]) 

Ожидаемый вывод -

(skuid,Map(largeImage_1 -> [Media/Device Images/Large Images/Huawei Images Large/GR5GRY-1,m110002,GR5GRY-1], largeImage_4 -> [Media/Device Images/Large Images/Huawei Images Large/GR5GRY-4,m110005,GR5GRY-4]) 

Может кто-нибудь мне помочь.

Спасибо,

1 Ответ

0 голосов
/ 26 апреля 2018

Анализ предоставленных вами данных заставил меня заключить, что все, что вам не хватает, это простая mapValues функция , где вы выполняете сортировку .

.mapValues(x => x.toList.sortBy(y => y._1))

Итак, ваш код должен быть

val skuRDD2:RDD[(String,Iterable[(String,ImageInfo2)])] = DF.select("ID", "TAG","MEDIA_ID","IMAGE_NAME","PATH").rdd
  .map(r => (r .getString(0),( r.getString(1),ImageInfo2(r.getString(2),r.getString(3),r.getString(4)))) )
  .groupByKey().mapValues(x => x.toList.sortBy(y => y._1))

Надеюсь, ответ полезен

...