Как отсортировать каждую строку rdd в spark с помощью scala?

В моем текстовом файле есть следующие данные:

10,14,16,19,52
08,09,12,20,45
55,56,70,78,53

Я хочу отсортировать каждую строку в порядке убывания. Я пробовал приведенный ниже код

val file = sc.textFile("Maximum values").map(x=>x.split(","))
val sorted = file.sortBy(x=> -x(2).toInt)
sorted.collect()

Я получил вывод ниже

[[55, 56, 70, 78, 53], [10, 14, 16, 19, 52], [08, 09, 12, 20, 45]]

Приведенный выше результат показывает, что весь список был отсортирован в порядке убывания. Но я хочу отсортировать каждое значение в порядке убывания.

E.g

[10,14,16,19,52],[08,09,12,20,45],[55,56,70,78,53]

должно быть

[52,19,16,14,10],[45,20,12,09,08],[78,70,56,55,53]

Пожалуйста, найдите время, чтобы ответить на этот вопрос. Заранее спасибо.


person abdul rahim    schedule 27.09.2018    source источник


Ответы (3)


Проверь это.

val file = spark.sparkContext.textFile("in/sort.dat").map( x=> { val y = x.split(','); y.sorted.reverse.mkString(",") }  )
file.collect.foreach(println)

EDIT1: как различные методы применяются к приведенному выше коду.

scala> val a = "10,14,16,19,52"
a: String = 10,14,16,19,52

scala> val b = a.split(',')
b: Array[String] = Array(10, 14, 16, 19, 52)

scala> b.sorted
res0: Array[String] = Array(10, 14, 16, 19, 52)

scala> b.sorted.reverse
res1: Array[String] = Array(52, 19, 16, 14, 10)

scala> b.sorted.reverse.mkString(",")
res2: String = 52,19,16,14,10

scala> b.sorted.reverse.mkString("*")
res3: String = 52*19*16*14*10

scala>

EDIT2:

val file = spark.sparkContext.textFile("in/sort.dat").map( x=> { val y = x.split(',').map(_.toInt); y.sorted.reverse.mkString(",") }  )
file.collect.foreach(println)
person stack0114106    schedule 27.09.2018
comment
Я новичок в искрах и скалах, я был бы очень рад, если бы вы могли объяснить мне использование разделителя для переменной 'y'. то есть y.sorted.reverse.mkString(,) - person abdul rahim; 28.09.2018
comment
'y' будет массивом строк. когда вы сортируете с помощью sorted, это происходит в алфавитном порядке, поэтому вы получаете от меньшего к большему в массиве. Итак, переверните массив, используя обратный метод, и mkString просто объединит все элементы массива, используя указанный вами разделитель, который является запятой здесь. Я добавил EDIT1 в ответ, чтобы показать результаты в REPL. - person stack0114106; 28.09.2018
comment
если у вас есть строка типа 5,18,26,72,61, то она будет сортироваться как 72,61,5,26,18 .. Итак, для сортировки целых чисел после разделения вам нужно преобразовать их в целые числа. см. мой РЕДАКТИРОВАТЬ2 - person stack0114106; 28.09.2018

Вот один из способов (непроверенный)

val reverseStringOrdering = Ordering[String].reverse
val file = sc.textFile("Maximum values").map(x=>x.split(",").sorted(reverseStringOrdering))
val sorted = file.sortBy(r => r, ascending = false)
sorted.collect()
person Terry Dactyl    schedule 27.09.2018
comment
Большое спасибо. Но функция sortBy требует определения неявного порядка. Поэтому я только что добавил его, и идеальный код выглядит так, как показано ниже. val reverseStringOrdering = Ordering[String].reverse val file = sc.textFile(/user/rahimenzo4891/Datasets/Maximum values).map(x=›x.split(,).sorted(reverseStringOrdering)) val sorted = file.sortBy (r => r(1), по возрастанию = true) sorted.collect() - person abdul rahim; 28.09.2018
comment
Если вы сортируете по элементу 1, то есть r(1), вы не гарантируете, что ваши списки будут отсортированы в правильном порядке. - person Terry Dactyl; 28.09.2018

Spark SQL,

import org.apache.spark.sql.functions._
val df = Seq(
 ("10","14","16","19","52"),
 ("08","09","12","20","45"),
 ("55","56","70","78","53")).toDF("C1", "C2","C3","C4","C5")

 df.withColumn("sortedCol", sort_array(array("C1", "C2","C3","C4","C5"), false))
  .select("sortedCol")     
  .show()

Выход

+--------------------+
|           sortedCol|
+--------------------+
|[52, 19, 16, 14, 10]|
|[45, 20, 12, 09, 08]|
|[78, 70, 56, 55, 53]|
+--------------------+
person Karthick    schedule 27.09.2018