#arrays #scala #sorting #apache-spark #rdd
#массивы #scala #сортировка #apache-spark #rdd
Вопрос:
Меня интересует apache SPARK.
Я попытался отсортировать по возрастанию множественный массив SPARK RDD по любому столбцу в scala.
(т. е. RDD[Array[Int] -> Array(Array(1,2,3), Array(2,3,4), Array(1,2,1))
Если я отсортирую по первому столбцу, то результатом будет Array(Array(1,2,3), Array(1,2,1), Array(2,3,4)).
или если я отсортирую по третьему столбцу, то результатом будет Array(Array(1,2,3), Array(1,2,3), Array(2,3,4)).
) и затем, я хочу получить значение возвращаемого типа RDD[Array[Int]]. Есть ли способ решить эту проблему, используя map()
или filter()
функцию?
Ответ №1:
Используйте RDD.sortBy
:
// sorting by second column (index = 1)
val result: RDD[Array[Int]] = rdd.sortBy(_(1), ascending = true)
Функция сортировки также может быть написана с использованием сопоставления с образцом:
val result: RDD[Array[Int]] = rdd.sortBy( {
case Array(a, b, c) => b /* choose column(s) to sort by */
}, ascending = true)
Также обратите внимание, что значение ascending
аргумента по умолчанию равно true
, поэтому вы можете удалить его и получить тот же результат:
val result: RDD[Array[Int]] = rdd.sortBy(_(1))
Комментарии:
1. Это работает. Спасибо, но не могли бы вы ответить еще на один вопрос, если не возражаете? Если я вставляю 4 или более размерных массивов, то мне приходится давать команду, вводя другой оператор case.
2. Не обращайте внимания на мой последний комментарий. Спасибо ~~
Ответ №2:
val baseRdd = sc.parallelize(Array(Array(1, 2, 3), Array(2, 3, 4), Array(1, 2, 1)))
//False specifies desending order
val result = baseRdd.sortBy(x => x(1), false)
result.foreach { x => println(x(0) "t" x(1) "t" x(2)) }
Результат
2 3 4
1 2 3
1 2 1
Комментарии:
1. Не могли бы вы ответить еще на один вопрос, если не возражаете? Я хочу создать новый массив RDD с некоторыми элементами, извлеченными из исходного массива RDD. (т. Е. Вот
RDD[Array[Int]] -> Array(Array(1,2,3), Array(2,3,4), Array(1,2,1).
И я хочу создать новый массив RDD из исходного массива RDD ->Array(Array(1,2,3), Array(1,2,1))
вот так.) Есть ли способ решить эту проблему?2. Да, вы можете это сделать. один быстрый вопрос. на каком основании вы хотите извлечь данные из вашего исходного rdd? это помогло бы мне дать вам точный ответ.
3. исходный массив rdd означает, что,
RDD[Array[Int]] -> Array(Array(1,2,3), Array(2,3,4), Array(1,2,1)).
как я уже сказал, я хочу создать новый массив rdd(Array(Array(1,2,3), Array(1,2,1))
из RDD[Array[Int]] -> Array (Массив (1,2,3), Массив(2,3,4), Массив (1,2,1)).` Для меня это сложно…4. вам нужно применить метод filter(). метод filter вернет true или false. Я не уверен, каковы ваши параметры для его фильтрации. но приведу один пример ..
5. значение baseRdd = sc.parallelize(Массив(Массив(1, 2, 3), Массив(2, 3, 4), Массив (1, 2, 1))) значение RESULTTRDD = baseRdd.filter { x => x(1).!=(3) } RESULTTRDD.foreach { x => println(x(0) «t» x(1) «t» x(2)) }