Я искал вокруг и не нашел способа реструктурировать столбец информационного фрейма, чтобы динамически добавлять новые столбцы в информационный фрейм на основе содержимого массива. Я новичок в python, поэтому я могу искать неправильные термины и быть причиной, по которой я пока не нашел четкого примера. Пожалуйста, дайте мне знать, если это дубликат и ссылка, чтобы найти его. Я думаю, что мне просто нужно указать в правильном направлении.
Хорошо, подробности.
Среда - pyspark 2.3.2 и python 2.7
Пример столбца содержит 2 массива, которые соотносятся друг с другом от 1 до 1. Я хотел бы создать столбец для каждого значения в массиве заголовки и поставить соответствующее имя (в персона массив) соответствующего столбца.
Я придумал пример, чтобы сосредоточиться на моей проблеме с изменением кадра данных.
import json
from pyspark.sql.types import ArrayType, StructType, StructField, StringType
from pyspark.sql import functions as f
input = { "sample": { "titles": ["Engineer", "Designer", "Manager"], "person": ["Mary", "Charlie", "Mac"] }, "location": "loc a"},{ "sample": { "titles": ["Engineer", "Owner"],
"person": ["Tom", "Sue"] }, "location": "loc b"},{ "sample": { "titles": ["Engineer", "Designer"], "person": ["Jane", "Bill"] }, "location": "loc a"}
a = [json.dumps(input)]
jsonRDD = sc.parallelize(a)
df = spark.read.json(jsonRDD)
Это схема моего фрейма данных:
In [4]: df.printSchema()
root
|-- location: string (nullable = true)
|-- sample: struct (nullable = true)
| |-- person: array (nullable = true)
| | |-- element: string (containsNull = true)
| |-- titles: array (nullable = true)
| | |-- element: string (containsNull = true)
Данные моего фрейма данных:
In [5]: df.show(truncate=False)
+--------+-----------------------------------------------------+
|location|sample |
+--------+-----------------------------------------------------+
|loc a |[[Mary, Charlie, Mac], [Engineer, Designer, Manager]]|
|loc b |[[Sue, Tom], [Owner, Engineer]] |
|loc a |[[Jane, Bill], [Engineer, Designer]] |
+--------+-----------------------------------------------------+
И как бы я хотел, чтобы мой фрейм данных выглядел:
+--------+-----------------------------------------------------+------------+-----------+---------+---------+
|location|sample |Engineer |Desginer |Manager | Owner |
+--------+-----------------------------------------------------+------------+-----------+---------+---------+
|loc a |[[Mary, Charlie, Mac], [Engineer, Designer, Manager]]|Mary |Charlie |Mac | |
|loc b |[[Sue, Tom], [Owner, Engineer]] |Tom | | |Sue |
|loc a |[[Jane, Bill], [Engineer, Designer]] |Jane |Bill | | |
+--------+-----------------------------------------------------+------------+-----------+---------+---------+
Я пытался использовать функцию разнесения, только чтобы в итоге получилось больше записей с полем массива в каждой записи. В stackoverflow было несколько примеров, но у них есть статические имена столбцов. Этот набор данных может иметь их в любом порядке, и новые заголовки могут быть добавлены позже.