У меня есть какой-то json, который читается из файла, где каждая строка выглядит примерно так:
{
"id": "someGuid",
"data": {
"id": "someGuid",
"data": {
"players": {
"player_1": {
"id": "player_1",
"locationId": "someGuid",
"name": "someName",
"assets": {
"assetId1": {
"isActive": true,
"playlists": {
"someId1": true,
"someOtherId1": false
}
},
"assetId2": {
"isActive": true,
"playlists": {
"someId1": true
}
}
}
},
"player_2": {
"id": "player_2",
"locationId": "someGuid",
"name": "someName",
"dict": {
"assetId3": {
"isActive": true,
"playlists": {
"someId1": true,
"someOtherId1": false
}
},
"assetId4": {
"isActive": true,
"playlists": {
"someId1": true
}
}
}
}
}
},
"lastRefreshed": "2020-01-23T19:29:15.6354794Z",
"expiresAt": "9999-12-31T23:59:59.9999999",
"dataSourceId": "someId"
}
}
У меня возникают трудности при попытке найти способ, используя python или sql в pyspark на Azure Блоки данных, чтобы превратить это json в табличный формат, подобный следующему:
+===========+=============+===============+===========+==============+=============+=================+
| Location | Player_ID | Player | Asset_ID | Asset_Active | Playlist_ID | Playlist_Status |
+===========+=============+===============+===========+==============+=============+=================+
| someId | player_1 | ThisIsAPlayer | anotherId | TRUE | someOtherId | FALSE |
+-----------+-------------+---------------+-----------+--------------+-------------+-----------------+
Задача состоит в том, чтобы преобразовать указанное выше свойство Players в несколько строк в каждой локации. Местоположение может иметь любое количество игроков с разными идентификаторами. Возможно, я бы не задавал этот вопрос, если бы свойство Players было массивом объектов проигрывателя вместо словаря, но я не имею никакого контроля над структурой этого документа, поэтому я должен работать с этим. Это не проблема в чем-то вроде PowerBI, где манипулирование данными более прямолинейно.
Самое дальнее, что мне удалось получить, - это сделать что-то вроде этого:
df = spark.read.json(filePath).select("data.id", "data.lastRefreshed", "data.expiresAt","data.dataSourceId","data.data.players.*")
Но это приводит к кадру / таблице данных, которая расширяет все вложенные структуры игроков ниже по столбцам. Я искал SO, ища кого-то с похожей ситуацией, но не повезло.
Как мне go разобрать / расширить столбец игроков в этом кадре данных, чтобы разделить строки?
В pyspark, я имею дело с Spark 2.4.3