Обработка преобразования строки в массив в фрейме данных pyspark - PullRequest
0 голосов
/ 25 октября 2018

У меня есть файл (csv), который при чтении в искровом фрейме данных имеет следующие значения для схемы печати

-- list_values: string (nullable = true)

значения в столбце list_values ​​выглядят примерно так:

[[[167, 109, 80, ...]]]

Возможно ли преобразовать это в тип массива вместо строки?

Я попытался разделить его и использовать код, доступный онлайн для подобных проблем:

df_1 = df.select('list_values', split(col("list_values"), ",\s*").alias("list_values"))

, но если я запустил приведенный выше код,массив, который я получаю, пропускает много значений в исходном массиве, т. е.

вывод приведенного выше кода:

[, 109, 80, 69, 5...

, который отличается от исходного массива, т. е. (- 167 отсутствует)

[[[167, 109, 80, ...]]] 

Поскольку я новичок в Spark, у меня мало знаний о том, как это делается (Для Python я мог бы выполнить ast.literal_eval, но в Spark этого не предусмотрено.

Поэтому я повторю вопрос еще раз:

Как я могу преобразовать / преобразовать массив, хранящийся в виде строки, в array т.е.

'[]' to [] conversion

1 Ответ

0 голосов
/ 25 октября 2018

Предположим, что ваш DataFrame был следующим:

df.show()
#+----+------------------+
#|col1|              col2|
#+----+------------------+
#|   a|[[[167, 109, 80]]]|
#+----+------------------+

df.printSchema()
#root
# |-- col1: string (nullable = true)
# |-- col2: string (nullable = true)

Вы можете использовать pyspark.sql.functions.regexp_replace для удаления начальных и конечных квадратных скобок.Как только это будет сделано, вы можете split получившуюся строку в ", ":

from pyspark.sql.functions import split, regexp_replace

df2 = df.withColumn(
    "col3",
    split(regexp_replace("col2", r"(^\[\[\[)|(\]\]\]$)", ""), ", ")
)
df2.show()

#+----+------------------+--------------+
#|col1|              col2|          col3|
#+----+------------------+--------------+
#|   a|[[[167, 109, 80]]]|[167, 109, 80]|
#+----+------------------+--------------+

df2.printSchema()
#root
# |-- col1: string (nullable = true)
# |-- col2: string (nullable = true)
# |-- col3: array (nullable = true)
# |    |-- element: string (containsNull = true)

Если вы хотите, чтобы столбец представлял собой массив целых чисел, вы можете использовать приведение:

from pyspark.sql.functions import col
df2 = df2.withColumn("col3", col("col3").cast("array<int>"))
df2.printSchema()
#root
# |-- col1: string (nullable = true)
# |-- col2: string (nullable = true)
# |-- col3: array (nullable = true)
# |    |-- element: integer (containsNull = true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...