json - 在 Athena 中查询可选嵌套 JSON 字段

标签 json amazon-web-services aws-glue amazon-athena

我的 json 数据看起来像这样:

{ "col1" : 123, "metadata" : { "opt1" : 456, "opt2" : 789 } }

其中各种元数据字段(有很多)是可选的,并且可能存在也可能不存在。

我的查询是:

select col1, metadata.opt1 from "db-name".tablename

如果 opt1 不存在于任何行中,我希望这会返回 opt1 列中包含空白的所有行,但如果没有行当爬网程序运行时,metadata 中的 opt1 (并且当查询运行时可能仍然不存在于数据中,因为它是可选的),查询失败,并显示:

SYNTAX_ERROR: line 2:1: Column '"metadata"."opt1"' cannot be resolved

我可以在架构定义中手动指定这些字段(如果我不使用爬网程序),但它不会拾取可能到达的任何新元数据字段,并且指定静态架构似乎并不存在遵循 Athena 的工作精神。

如何让它按预期运行(最好不要放入虚拟行或自定义 SerDe)?

目前使用 SerDe org.openx.data.jsonserde.JsonSerDe

感谢您的任何想法。

最佳答案

这可能不是您想听到的,但我建议您不要使用 Glue Crawler。这只是当您的用例与设计用途不完全匹配时所产生的问题的冰山一角(例如,请参阅 this questionthis questionthis questionthis questionthis question )。

相反,使用 Glue Crawler 在工作时为您创建的任何内容手动创建表(您可以在 Athena 中使用 SHOW CREATE TABLE foo 获取表的 DDL)。然后使用 ALTER TABLE foo ADD PARTITION 手动添加分区。

无论您使用什么方法,使表中的可选字段保持最新都会很复杂。如果您只添加过,则可以在添加具有更多列的新分区时更新表的列(如果您使用 Athena 执行此操作,请在添加分区之前执行此操作),但另一种方法是简单地将 metadata 列键入为 STRING并使用 JSON 函数提取查询中的属性(例如,请参阅 this question/answer )。

我假设您正在使用 Glue Crawler 定期添加分区。如果您控制向 S3 添加数据的流程,我建议您添加运行 ALTER TABLE … ADD PARTITION 的代码(或在 Glue API 中使用 CreatePartition )。

如果您无法控制该代码,或者这会很不方便,您可以使用 Lambda 来解决问题。例如,如果您仅按时间分区,则可以每天运行一次并添加第二天的分区(S3上不必有任何数据,您可以添加尚未包含数据的分区,这是只是元数据)。如果情况比这更复杂,您可以在 S3 上创建新文件时触发 Lambda 函数运行,并添加分区作为 react 。

这听起来可能比使用 Glue Crawler 更复杂,如果 Glue Crawler 确实按照您的预期工作,那就会是这样。由于它们实际上工作得不太好,所以工作量会少很多。

关于json - 在 Athena 中查询可选嵌套 JSON 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61297671/

相关文章:

c# - 将 .NET 外部 dll 合并到单个可执行文件

amazon-web-services - AWS CFT Glue 在 DynamoDB Target 中添加采样

postgresql - AWS Aurora Postgres 中的并行计划/查询

amazon-web-services - 如何创建基于身份的策略策略允许 iam :CreateRole action

amazon-web-services - 如何使用glue启动AWS cloudformation堆栈?

aws-cli - 是否可以使用 AWS CLI 仅更新部分 Glue 作业?

php - android图像文件上传成功运行但图像未移动到文件夹

json - Sequelize : How to return relationships as JSON attribute?

json 编码 - 为什么 utf8 和 utf-8 产生不同的输出?

swift - AWS - 尝试创建策略 - 资源字段无效