Распакуйте значения в ArrayType как столбцы в df - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть приведенный ниже фрейм данных pyspark, который я создал, прочитав файл JSON, и я хочу распаковать значения в содержимом столбца и использовать ключи в качестве новых столбцов, а значения в качестве значений в одном и том же кадре данных. Как я мог это сделать? Нужно ли мне изменять файл JSON перед тем, как я прочитаю его как фрейм данных, или я могу сделать это как операцию над фреймом данных?

json структура файла:

{"account_id": "a01", "contents": [{"service_id": "S121", "price": 1256}, {"service_id": "S022", "price": 1149}], "date": "2020-03-22 05:53:53.358149"}

schema:
 |-- contents: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- price: long (nullable = true)
 |    |    |-- service_id: string (nullable = true)
 |-- account_id: string (nullable = true)
 |-- date: string (nullable = true)

generated table:
+--------------------+-----------+--------------------+
|            contents|account_id |    date            |
+--------------------+-----------+--------------------+
|[[1256, S121],[11,..|        a01|2020-01-17 05:53:...|
|[[556, S03], [114...|        a01|2020-01-16 23:58:...|


and i would like it to be something like:
-----------+--------------------+-----+----------+
|account_id |    date            |price|service_id|
+-----------+--------------------+-----+----------+
|        a01|2020-01-17 05:53:...| 1256|      S121|
|        a01|2020-01-17 05:53:...|1149 |     S022 |

1 Ответ

1 голос
/ 18 апреля 2020

Поскольку у вас array column должно быть exploded, затем выберите * в столбце структуры.

Example:

#sample df
df.printSchema()
#root
# |-- account_id: string (nullable = true)
# |-- contents: array (nullable = true)
# |    |-- element: struct (containsNull = true)
# |    |    |-- price: long (nullable = true)
# |    |    |-- service_id: string (nullable = true)
# |-- date: string (nullable = true)

from pyspark.sql.functions import *

df.withColumn("arr",explode(col("contents"))).\
select("account_id","date","arr.*").\
show()
#+----------+--------------------------+-----+----------+
#|account_id|date                      |price|service_id|
#+----------+--------------------------+-----+----------+
#|a01       |2020-03-22 05:53:53.358149|1256 |S121      |
#|a01       |2020-03-22 05:53:53.358149|1149 |S022      |
#+----------+--------------------------+-----+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...