在火花对 RDD 中按值排序

Posted

技术标签:

【中文标题】在火花对 RDD 中按值排序【英文标题】:Order by value in spark pair RDD 【发布时间】:2014-11-17 09:59:36 【问题描述】:

我有一个如下的火花对 RDD (key, count)

Array[(String, Int)] = Array((a,1), (b,2), (c,1), (d,3))

使用 spark scala API 如何获取一个新的按值排序的 RDD 对?

所需结果:Array((d,3), (b,2), (a,1), (c,1))

【问题讨论】:

值中可能有重复吗?如果不是:交换键和值并按键排序,交换回来。 是的,值是重复的。 【参考方案1】:

这应该可行:

//Assuming the pair's second type has an Ordering, which is the case for Int
rdd.sortBy(_._2) // same as rdd.sortBy(pair => pair._2)

(虽然你可能想在有关系时也考虑到密钥。)

【讨论】:

嗨@GáborBakos,我创建了一个这样的地图-val b = a.map(x => (x(0), x) ) 这里b 的类型是org.apache.spark.rdd.RDD[(Any, org.apache.spark.sql.Row)] 当我尝试b.sortBy(_._2) 时它不起作用。有没有讨论如何使用_ 嗨@SumitKumarGhosh,这似乎是一个不同的问题。我认为您需要为您的org.apache.spark.sql.Row 类型定义一个Ordering,因为它不是Ordered。如果您创建一个新问题,请也添加错误消息。 _ 只是以下内容的语法糖:aVariable => aVariable,所以_._2 也可以这样写:pair => pair._2 [链接] (***.com/questions/30469864/…) 对于那些来到这篇文章寻找 PySpark 解决方案的人:rdd.sortBy(lambda pair:pair[1]) 降序使用:rdd.sortBy(_._2, false) 参考:***.com/questions/41918826/…【参考方案2】:

按key和value升序和降序排序

val textfile = sc.textFile("file:///home/hdfs/input.txt")
val words = textfile.flatMap(line => line.split(" "))
//Sort by value in descending order. For ascending order remove 'false' argument from sortBy
words.map( word => (word,1)).reduceByKey((a,b) => a+b).sortBy(_._2,false)
//for ascending order by value
words.map( word => (word,1)).reduceByKey((a,b) => a+b).sortBy(_._2)

//Sort by key in ascending order
words.map( word => (word,1)).reduceByKey((a,b) => a+b).sortByKey
//Sort by key in descending order
words.map( word => (word,1)).reduceByKey((a,b) => a+b).sortByKey(false)

这可以通过在交换键和值后应用 sortByKey 以另一种方式完成

//Sort By value by swapping key and value and then using sortByKey
val sortbyvalue = words.map( word => (word,1)).reduceByKey((a,b) => a+b)
val descendingSortByvalue = sortbyvalue.map(x => (x._2,x._1)).sortByKey(false)
descendingSortByvalue.toDF.show
descendingSortByvalue.foreach n => 
val word=  n._1
val count = n._2
println(s"$word:$count")

【讨论】:

感谢 Vijay Innamuri 后一种情况,不应该这样吗? val descendingSortByvalue = sortbyvalue.map(x => (x._2,x._1)).sortByKey(false)

以上是关于在火花对 RDD 中按值排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用火花流检查 rdd 是不是为空?

对数据帧火花执行操作时出现空指针异常

如何在火花中将rdd对象转换为数据框

火花模式rdd到RDD

火花,在DataFrame(或RDD)上多次应用过滤器,而没有多余的评估

如何在文本文件中保存 rdd 操作?斯卡拉/火花