如何在 S3 中查询异构 JSON 数据?

How do I query heterogeneous JSON data in S3?

我们有一个 Amazon S3 存储桶,其中包含大约一百万 JSON 个文件,每个文件压缩约 500KB。这些文件由 AWS Kinesis Firehose 放在那里,每 5 分钟写入一个新文件。这些文件都描述了类似的事件,因此在逻辑上都是相同的,并且都是有效的 JSON,但有不同的 structures/hierarchies。它们的格式和行尾也不一致:有些对象在一行上,有些在多行上,有时一个对象的结尾与另一个对象的开头在同一行(即 }{)。

我们需要 parse/query/shred 这些对象,然后将结果导入我们的本地数据仓库 SQL 服务器数据库。

Amazon Athena 无法处理不一致的 spacing/structure。我想创建一个 Lambda 函数来清理间距,但这仍然存在不同结构的问题。由于文件是由 Kinesis 放置的,这会强制您将文件放在按年、月、日和小时嵌套的文件夹中,因此我们每年必须创建数千个分区。 Athena 中的分区数量限制并不为人所知,但研究表明,如果我们每小时创建一个分区,我们很快就会用完这个限制。

我研究过先将数据泵入 Redshift,然后再将其拉下。 Amazon Redshift 外部表可以处理间距问题,但无法处理几乎所有这些文件都有的嵌套 JSON。 COPY 命令可以处理嵌套的 JSON,但要求我们事先知道 JSON 结构,并且不允许我们访问文件名,我们需要完整导入(这是我们获得日期的唯一方法)。总的来说,Redshift 和 Athena 有同样的问题:结构不一致导致很难定义 schema。

我研究过使用像 AWS Glue 这样的工具,但它们只是移动数据,它们无法将数据移动到我们的本地服务器中,所以我们必须找到某种中介,这会增加成本,延迟和维护开销。

我尝试去掉中间人并使用 ZappySys 的 S3 JSON SSIS 任务直接拉取文件并将它们聚合到一个 SSIS 包中,但它无法处理间距问题或结构不一致。

我不可能是第一个遇到这个问题的人,但我一直在不停地转。

我可能会建议两种解决方案

  1. 我相信MongoDB/DynamoDB/Cassandra擅长处理异构JSON结构。我不确定你 JSON 中的不一致,但只要它是有效的 JSON,我相信它应该可以在上述数据库之一中摄取。如果可能,请提供示例 JSON。但这些工具各有优缺点。这些 No SQL 的数据建模与传统的 SQL 完全不同。
  2. 我不确定为什么您的 Lambda 无法进行清理。我相信当存储桶中发生 S3 PUT 时,您会尝试调用 Lambda。这应该能够清理 JSON 除非涉及复杂的过程。

除非 JSON 的格式正确,否则没有任何工具能够完美地处理它,我相信 MongoDB/DyanoDB/Cassandra 比 Athena 或 Spectrum 更适合这个用例

如果您能分享一下您在创建大量分区时遇到的限制,那就太好了?

Rumble is an open-source (Apache 2.0) engine that allows you to use the JSONiq query language to directly query JSON (specifically, JSON Lines 个文件)存储在 S3 上,无需将其移动到其他任何地方或将其导入任何数据存储。在内部,它使用 Spark 和 DataFrames。

它在超过 200 亿个对象(10+ TB)的集合上成功测试,如果数据是嵌套和异构的(缺失字段、额外字段、同一字段中的不同类型等),它也可以无缝工作).它还通过 Amazon EMR 集群进行了测试。

更新:Rumble 还适用于 Parquet、CSV、ROOT、AVRO、文本和 SVM,以及 HDFS、S3 和 Azure。