按Spark中的RDD列排序

时间:2018-12-18 08:03:03

标签: scala sorting apache-spark

我有一个public abstract class addressDecorator extends GridPane implements addressbookInterface { public addressbookInterface address; public addressDecorator(addressbookInterface address) { this.address = address; } @Override public addressbookInterface getAddressBookPane() { return address; } } 类型的RDD点,并且必须针对每一列进行迭代排序。要排序的列存储在变量'[(Double, Double)]'中,并根据RDD是按第1列还是按第2列对RDD进行排序,得出的值为0或1。我尝试了以下方法,但似乎都不起作用:

axis

    val sorted = points.sortBy(p => p._(axis))

我收到以下错误: val sorted = points.sortBy(_(axis)) 涉及默认参数的应用程序中发生错误。

在这方面的任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用productElement方法来动态访问元组的元素。

唯一的问题是此方法返回一个Any,因此您需要将其转换为Double(为此,您需要首先将Any转换为{{1 }})

尝试一下:

String

示例

输入

points.sortBy(_.productElement(axis).toString.toDouble)

AXIS = 1

points.foreach(println)
(0,1)
(1,0)

AXIS = 0

scala> val axis= 1
axis: Int = 1

scala> points.sortBy(_.productElement(axis).toString.toDouble)
res19: org.apache.spark.rdd.RDD[(Int, Int)] = MapPartitionsRDD[16] at sortBy at <console>:28

scala> res19.foreach(println)
(1,0)
(0,1)

答案 1 :(得分:1)

您可以这样做:

  def sortValue(axis: Int)(p: (Double, Double)) = if (axis == 0) p._1 else p._2

  val sorted = points.sortBy(p => sortValue(axis)(p))