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

nat*_*vin 5 sql-server amazon-s3 amazon-redshift amazon-athena

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

我们需要解析/查询/粉碎这些对象,然后将结果导入到我们的本地数据仓库 SQL Server 数据库中。

Amazon Athena 无法处理不一致的间距/结构。我想过创建一个 Lambda 函数来清理间距,但这仍然留下了不同结构的问题。由于文件是由 Kinesis 放置的,这迫使您将文件放入按年、月、日和小时嵌套的文件夹中,因此我们每年必须创建数千个分区。Athena 中分区数量的限制尚不清楚,但研究表明,如果我们每小时创建一个分区,我们很快就会耗尽这一限制。

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

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

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

我不是第一个面对这个问题的人,但我只是一直在原地踏步。

Ghi*_*rny 5

Rumble是一个开源 (Apache 2.0) 引擎,允许您使用JSONiq查询语言直接查询存储在 S3 上的 JSON(特别是JSON Lines文件),而无需将其移动到其他地方或将其导入到任何数据存储中。在内部,它使用 Spark 和 DataFrames。

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

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


Muk*_*und 2

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

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

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

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