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)

Что происходит, так это то, что в результате будет одна строка на элемент в каждой исходной строке playerarray, и вы можете получить доступ к столбцам как из исходной строки, так и из элемента player. ВAS t(player) синтаксис просто означает, что виртуальная таблица, содержащая элементы массива, должна вызываться t и есть столбец с именем player.

Есть много других вопросов о UNNEST здесь, в stackru, где вы тоже можете найти вдохновение.

Если вы хотите запускать запросы к плоской структуре, вы можете создать представление из запроса выше и запускать запросы для этого представления. Если не считать производительности, это будет так, как если бы ваши данные были сглажены.

Производительность будет зависеть от множества деталей, и не оптимизируйте без необходимости. Вы можете использовать приведенный выше запрос для создания нового набора плоских данных с помощью CTAS.

Другие вопросы по тегам