【问题标题】:Order by value in spark pair RDD在火花对 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))

【问题讨论】:

  • 值中可能有重复吗?如果不是:交换键和值并按键排序,交换回来。
  • 是的,值是重复的。

标签: scala apache-spark


【解决方案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
  • 对于那些来到这篇文章寻找 PySpark 解决方案的人:rdd.sortBy(lambda pair:pair[1])
  • 降序使用:rdd.sortBy(_._2, false) 参考:stackoverflow.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)
猜你喜欢
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 2015-07-10
  • 2021-04-04
  • 1970-01-01
相关资源
最近更新 更多