目标: 我们希望使用 AWS Glue 数据目录为驻留在 S3 存储桶中的 JSON 数据创建一个表,然后我们将通过 Redshift Spectrum 对其进行查询和解析。
背景: JSON 数据来自 DynamoDB Streams,嵌套很深。第一级 JSON 有一组一致的元素:Keys、NewImage、OldImage、SequenceNumber、ApproximateCreationDateTime、SizeBytes 和 EventName。唯一的变化是有些记录没有NewImage,有些没有OldImage。但是,在这第一级之下,模式变化很大。
理想情况下,我们希望使用 Glue 仅解析 JSON 的第一级,并且基本上将较低级别视为大型 STRING 对象(然后我们将根据需要使用 Redshift Spectrum 对其进行解析)。目前,我们正在将整个记录加载到 Redshift 中的单个 VARCHAR 列中,但记录接近 Redshift 中数据类型的最大大小(最大 VARCHAR 长度为 65535)。因此,我们希望在记录到达 Redshift 之前执行第一级解析。
到目前为止我们尝试/参考的内容:
- 将 AWS Glue Crawler 指向 S3 存储桶会导致数百个表具有一致的顶级架构(上面列出的属性),但在 STRUCT 元素的更深层次上会出现不同的架构。我们还没有找到一种方法来创建从所有这些表中读取并将其加载到单个表中的 Glue ETL 作业。
- 手动创建表并没有什么成果。我们尝试将每一列设置为 STRING 数据类型,但该作业未能成功加载数据(大概是因为这将涉及从 STRUCT 到 STRING 的一些转换)。将列设置为 STRUCT 时,它需要一个定义的模式 - 但这正是从一条记录到另一条记录的不同,因此我们无法提供适用于所有相关记录的通用 STRUCT 模式。
- AWS Glue Relationalize 转换很有趣,但不是我们在这种情况下要寻找的(因为我们希望保持部分 JSON 完整,而不是完全压平它)。几周前Redshift Spectrum 支持标量 JSON数据,但这不适用于我们正在处理的嵌套 JSON。这些似乎都无法帮助处理由 Glue Crawler 创建的数百个表格。
问题: 我们如何使用 Glue(或其他方法)来允许我们仅解析这些记录的第一级 - 同时忽略顶层元素下方的不同模式 - 以便我们可以从 Spectrum 访问它或加载它身体进入红移?
我是胶水新手。我在 Glue 文档中花了很多时间,并在论坛上浏览(有些稀疏的)信息。我可能会遗漏一些明显的东西 - 或者这可能是 Glue 在其当前形式中的一个限制。欢迎任何建议。
谢谢!