Pyspark трансформирует список массивов в список строк - PullRequest
1 голос
/ 10 марта 2020

Имеется фрейм данных со списком массивов

Schema 
|-- items: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- name: string (nullable = true)
 |    |    |-- quantity: string (nullable = true)

+-------------------------------+
|items                          |
+-------------------------------+
|[[A, 1], [B, 1], [C, 2]]       |
---------------------------------

Как получить строку:

+-------------------------------+
|items                          |
+-------------------------------+
|A, 1, B, 1, C, 2               |
---------------------------------

Пробовал:

df.withColumn('item_str', concat_ws(" ", col("items"))).select("item_str").show(truncate = False)

Ошибка:

: org.apache.spark.sql.AnalysisException: cannot resolve 'concat_ws(' ', `items`)' due to data type mismatch: argument 2 requires (array<string> or string) type, however, '`items`' is of array<struct<name:string,quantity:string>> type.;;

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Вы можете достичь, используя комбинацию встроенных функций transform и array_join :

from pyspark.sql.functions import expr

df.withColumn("items", expr("array_join(transform(items, \
                                i -> concat_ws(',', i.name, i.quantity)), ',')"))

Мы используем transform для итерации между элементами и преобразования каждого из них в строку name,quantity. Затем мы используем array_join для объединения всех элементов, возвращаемых преобразованием, через запятую.

0 голосов
/ 10 марта 2020

Разнесение может быть полезно здесь

import org.apache.spark.sql.functions._
df.select(explode("items")).select("col.*")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...