Pyspark: взорвать JSON в столбце в несколько столбцов - PullRequest
0 голосов
/ 27 июня 2018

Данные выглядят так -

+-----------+-----------+-----------------------------+
|         id|      point|                         data|
+-----------------------------------------------------+
|        abc|          6|{"key1":"124", "key2": "345"}|
|        dfl|          7|{"key1":"777", "key2": "888"}|
|        4bd|          6|{"key1":"111", "key2": "788"}|

Я пытаюсь разбить его на следующий формат.

+-----------+-----------+-----------+-----------+
|         id|      point|       key1|       key2|
+------------------------------------------------
|        abc|          6|        124|        345|
|        dfl|          7|        777|        888|
|        4bd|          6|        111|        788|

Функция explode разбивает фрейм данных на несколько строк. Но это не желаемое решение.

Примечание: это решение не отвечает на мои вопросы. PySpark "взорвать" диктовку в столбце

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Как подсказывает @pault, поле данных представляет собой поле string. поскольку ключи одинаковые (т. е. 'key1', 'key2') в строке JSON над строками, вы также можете использовать json_tuple() (эта функция является новой в версии 1.6 на основе документации)

from pyspark.sql import functions as F

df.select('id', 'point', F.json_tuple('data', 'key1', 'key2').alias('key1', 'key2')).show()

Ниже Мой оригинальный пост: , что наиболее вероятно НЕПРАВИЛЬНО , если исходная таблица из df.show(truncate=False) и, таким образом, поле data НЕ является структурой данных Python.

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

from pyspark.sql import functions as F

df.select('id', 'point', F.col('data').getItem('key1').alias('key1'), F.col('data')['key2'].alias('key2')).show()
0 голосов
/ 27 июня 2018

Пока вы используете Spark версии 2.1 или выше, pyspark.sql.functions.from_json должен дать вам желаемый результат, но вам нужно будет сначала определить требуемый schema

from pyspark.sql.functions import from_json, col
from pyspark.sql.types import StructType, StructField, StringType

schema = StructType(
    [
        StructField('key1', StringType(), True),
        StructField('key2', StringType(), True)
    ]
)

df.withColumn("data", from_json("data", schema))\
    .select(col('id'), col('point'), col('data.*'))\
    .show()

что должно дать вам

+---+-----+----+----+
| id|point|key1|key2|
+---+-----+----+----+
|abc|    6| 124| 345|
|df1|    7| 777| 888|
|4bd|    6| 111| 788|
+---+-----+----+----+
...