AWS Glue - выравнивает глубоко вложенный JSON
Я хотел бы знать, есть ли способ сгладить глубоко вложенный JSON с помощью задания Glue ETL? В нем есть вложенные массивы. Я попытался запустить искатель Glue на JSON, который вернул каталог только с одним полем PerPlayer с типом данных struct. Должен ли я в задании приклеивания ETL использовать каталог или просто читать JSON в динамический фрейм и выполнять какое-то преобразование, чтобы сгладить его? Я смог сгладить с помощью relationalize, если есть только 1 запись (без массива), но мой ввод содержит несколько записей в структуре массива, а некоторые записи имеют несколько вложенных массивов внутри.
Я новичок в Glue ETL, поэтому буду благодарен за любой совет или предложение.
{
"PerPlayer": {
"requestNo": "REQ912",
"Batch_Number": "1",
"Total_No_Of_Batches": "1",
"player": [
{
"username": "user1",
"characteristics": {
"race": "Human",
"class": "Warlock",
"subclass": "Dawnblade",
"power": 300,
"playercountry": "USA"
},
"arsenal": [
{
"kinetic": {
"name": "Sweet Business",
"type": "Auto Rifle",
"power": 300,
"element": "Kinetic"
},
"energy": {
"name": "MIDA Mini-Tool",
"type": "Submachine Gun",
"power": 300,
"element": "Solar"
},
"power": {
"name": "Play of the Game",
"type": "Grenade Launcher",
"power": 300,
"element": "Arc"
}
},
{
"kinetic": {
"name": "Sweet Business1",
"type": "Auto Rifle1",
"power": 300,
"element": "Kinetic1"
},
"energy": {
"name": "MIDA Mini-Tool",
"type": "Submachine Gun",
"power": 300,
"element": "Solar1"
},
"power": {
"name": "Play of the Game1",
"type": "Grenade Launcher1",
"power": 300,
"element": "Arc1"
}
}
],
"armor": {
"head": "Eye of Another World",
"arms": "Philomath Gloves",
"chest": "Philomath Robes",
"leg": "Philomath Boots",
"classitem": "Philomath Bond"
},
"location": {
"map": "Titan",
"waypoint": "The Rig"
}
},
{
"username": "user2",
"characteristics": {
"race": "Alien",
"class": "Starwars",
"subclass": "Dawnblade",
"power": 300,
"playercountry": "USA"
},
"arsenal": {
"kinetic": {
"name": "salt Business",
"type": "Auto Rifle",
"power": 300,
"element": "Kinetic"
},
"energy": {
"name": "MIDA Mini-Tool",
"type": "Submachine Gun",
"power": 300,
"element": "Solar"
},
"power": {
"name": "Play of the Game",
"type": "Grenade Launcher",
"power": 400,
"element": "Arc"
}
},
"armor": {
"head": "Eye of Another World",
"arms": "Philomath Gloves",
"chest": "Philomath Robes",
"leg": "Philomath Boots",
"classitem": "Philomath Bond"
},
"location": {
"map": "Titan",
"waypoint": "The Rig"
}
}
]
}
}
1 ответ
К сожалению, это невозможно с Glue Crawlers, эта служба будет создавать только таблицы, которые выглядят как данные, а не изменять данные - и нет функции Athena, которая отображает вложенную иерархию в плоскую структуру на уровне serde.
Возможно, вы сможете сделать это с помощью Glue ETL, преобразовав данные в новый упорядоченный набор данных, но в целом мне кажется, что люди, которые пробуют Glue, в конечном итоге сталкиваются с большим количеством проблем, чем решают.
Что вы могли бы сделать, так это жить с таблицей, которую сканер создает для вас, и создать представление в Athena, которое выравнивает иерархию. Есть оператор по имениUNNEST
который поднимает элементы массива в виде строк. Это могло выглядеть примерно так:
SELECT
PerPlayer.requestNo,
PerPlayer.Batch_Number,
PerPlayer.Total_No_Of_Batches,
player.username,
player.characteristics.race,
player.characteristics.class,
-- and so on
FROM original_table, UNNEST (PerPlayer.player) AS t(player)
Что происходит, так это то, что в результате будет одна строка на элемент в каждой исходной строке player
array, и вы можете получить доступ к столбцам как из исходной строки, так и из элемента player. ВAS t(player)
синтаксис просто означает, что виртуальная таблица, содержащая элементы массива, должна вызываться t
и есть столбец с именем player
.
Есть много других вопросов о UNNEST
здесь, в stackru, где вы тоже можете найти вдохновение.
Если вы хотите запускать запросы к плоской структуре, вы можете создать представление из запроса выше и запускать запросы для этого представления. Если не считать производительности, это будет так, как если бы ваши данные были сглажены.
Производительность будет зависеть от множества деталей, и не оптимизируйте без необходимости. Вы можете использовать приведенный выше запрос для создания нового набора плоских данных с помощью CTAS.