如何对Spark中的groupByKey导致的键进行排序

时间:2018-04-25 10:51:09

标签: scala apache-spark apache-spark-sql rdd

在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进行排序,即。在上面的groupByKey输出中键入Iterable [(String,imageinfo2))。

输入(在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 :(得分:2)

分析您提供的数据让我得出结论,您所缺少的只是简单的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))

我希望答案很有帮助