0

我想知道是否有一种方法可以使用 Glue ETL 作业来展平深度嵌套的 JSON?这里面有嵌套的数组。我试图在 JSON 上运行一个 Glue 爬虫,它返回一个目录,其中只有 1 个字段 PerPlayer 和一个结构数据类型。在胶水 ETL 作业中,我应该使用目录还是只是将 JSON 读入动态框架并执行一些转换以将其展平?如果只有 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"
                }
            }
        ]
    }
}
4

1 回答 1

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,并且您可以访问原始行和播放器元素中的列。AS t(player)语法只是意味着应该调用包含数组元素的虚拟表并t有一个名为 的列player

Stack Overflow 上还有很多关于UNNEST这里的其他问题,您也可以从中寻找灵感。

如果您想对平面结构运行查询,您可以从上面的查询创建一个视图并针对该视图运行查询。抛开性能不谈,就好像您的数据被展平了一样。

性能将取决于很多细节,除非必要,否则不要优化。您可以使用上面的查询使用CTAS创建一个新的平面数据集。

于 2020-08-26T14:08:03.967 回答