Создать новый столбец с массивом диапазона чисел - PullRequest
0 голосов
/ 04 июля 2018

Поэтому мне нужно создать массив чисел, перечисляющий от 1 до 100 в качестве значения для каждой строки в качестве дополнительного столбца.

Использование функции array() с кучей литеральных значений работает, но, безусловно, есть способ использовать / конвертировать Scala Range(a to b) вместо перечисления каждого числа по отдельности?

spark.sql("SELECT key FROM schema.table")
  .otherCommands
  .withColumn("range", array(lit(1), lit(2), ..., lit(100)))

На что-то вроде:

withColumn("range", array(1 to 100))

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Проверено это решение с версией искры 2.2.0

Пожалуйста, попробуйте этот простой способ для того же:

val df = spark.range(5).toDF("id")
df.withColumn("range", lit(1 to 10 toArray)).show(false)

Вывод кода:

+---+-------------------------------+
|id |range                          |
+---+-------------------------------+
|0  |[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]|
|1  |[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]|
|2  |[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]|
|3  |[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]|
|4  |[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]|
+---+-------------------------------+
0 голосов
/ 05 июля 2018

Для Spark 2.2 + была введена новая функция typedLit, которая легко решает эту проблему без использования .map(lit(_)) в массиве. Из документации:

Разница между этой функцией и подсветкой состоит в том, что эта функция может обрабатывать параметризованные типы scala, например: List, Seq и Map.

Использовать следующим образом:

import org.apache.spark.sql.functions.typedLit

df.withColumn("range", typedLit((1 to 100).toList))
0 голосов
/ 04 июля 2018

Вы можете использовать map функцию, используя lit встроенную функцию внутри array функцию как

df.withColumn("range", array((1 to 100).map(lit(_)): _*))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...