在火花对 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 中按值排序的主要内容,如果未能解决你的问题,请参考以下文章