Мои входные данные имеют следующую форму:
[
{
"id": 123,
"embedded": {
"a": {
"x": true,
"y": 1,
},
"b": {
"x": false,
"y": 2,
},
},
},
{
"id": 456,
"embedded": {
"a": {
"x": false,
"y": 3,
},
"b": {
"x": true,
"y": 4,
},
},
},
]
Из-за некоторых сложностей моей настройки pyspark поле embedded
представляет собой struct с полями a
и b
на это.Хотя в будущем может появиться больше чем a
и b
ключей, и я не хочу жестко кодировать список полей в сценарии.
Я бы хотел, чтобы окончательные данные былив форме:
_______________________________
| id | key | x | y |
_______________________________
| 123 | a | true | 1 |
_______________________________
| 123 | b | false | 2 |
_______________________________
| 456 | a | false | 3 |
_______________________________
| 456 | b | true | 4 |
_______________________________
Я получаю, что хочу взорвать поле embedded
, чтобы получить его различные значения, но как я могу получить доступ к именам полей?
ИспользованиеPySpark ниже, я могу извлечь все значения для столбцов id
, x
и y
, но как я могу получить доступ к именам структурных полей (a
, b
, ...) при взрыве?
frame = frame.select(
explode(array("embedded.*")).alias("embedded"),
frame.id,
)
frame = frame.select(
frame.id,
frame.embedded.x,
frame.embedded.y,
)