У меня есть точки RDD типа [(Double, Double)]
, и мне нужно итеративно отсортировать их по каждому столбцу. Столбец, по которому выполняется сортировка, сохраняется в переменной «axis
» и оценивается как 0 или 1 в зависимости от того, должен ли RDD быть отсортирован по 1-му столбцу или 2-му столбцу. Я пробовал следующее, но, похоже, ничего из этого не работает:
val sorted = points.sortBy(p => p._(axis))
или,
val sorted = points.sortBy(_(axis))
Я получаю следующую ошибку: Error:(18, 39) (Double, Double) does not take parameters
Произошла ошибка в приложении, связанном с аргументами по умолчанию.
Любая помощь в этом отношении будет оценена. Спасибо!
Вы можете использовать метод productElement
для динамического доступа к элементу кортежа.
Единственная проблема заключается в том, что этот метод возвращает Any
, поэтому вам нужно преобразовать его в Double
(и для этого вам нужно сначала преобразовать Any
в String
).
Попробуй это:
points.sortBy(_.productElement(axis).toString.toDouble)
ПРИМЕР
Вход
points.foreach(println)
(0,1)
(1,0)
ОСЬ = 1
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)
ОСЬ = 0
scala> val axis= 0
axis: Int = 0
scala> points.sortBy(_.productElement(axis).toString.toDouble)
res24: org.apache.spark.rdd.RDD[(Int, Int)] = MapPartitionsRDD[26] at sortBy at <console>:28
scala> res24.foreach(println)
(0,1)
(1,0)
Сделать это можно так:
def sortValue(axis: Int)(p: (Double, Double)) = if (axis == 0) p._1 else p._2
val sorted = points.sortBy(p => sortValue(axis)(p))
.toString.toDouble
? Если значение равноDouble
(что в данном случае гарантировано), это намного медленнее, чем необходимо; если это не так, скорее всего, произойдет исключение.