首页 文章

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

提问于
浏览
0

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

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

亚马逊雅典娜无法处理不一致的间距/结构 . 我想创建一个可以清理间距的Lambda函数,但仍然存在不同结构的问题 . 由于文件是由Kinesis制定的,这迫使你将文件放在按年,月,日和小时嵌套的文件夹中,我们每年必须创建数千个分区 . 雅典娜分区数量的限制并不为人所知,但研究表明,如果我们每小时创建一个分区,我们很快就会用尽这个限制 .

我've looked at pumping the data into Redshift first and then pulling it down. Amazon Redshift external tables can deal with the spacing issues, but can'吨处理嵌套的JSON,几乎所有这些文件都有 . COPY 命令可以处理嵌套的JSON,但要求我们事先知道JSON结构,并且我们只能获得日期的方式 . 通常,Redshift与Athena具有相同的问题:不一致的结构使得定义模式变得困难 .

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

我已经尝试删除中间人并使用ZappySys的S3 JSON SSIS任务直接提取文件并将它们聚合在一个SSIS包中,但它无法处理间距问题或不一致的结构 .

我不能成为第一个面对这个问题的人,但我只是继续旋转我的车轮 .

1 回答

  • 1

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

    • 我相信MongoDB / DynamoDB / Cassandra擅长处理异构JSON结构 . 我不确定你的JSON中的不一致性,但只要它是一个有效的JSON,我相信它应该可以在上面的一个DB中输入 . 如果可能,请提供示例JSON . 但这些工具各有利弊 . 对于这些No SQL而言,数据建模与传统SQL完全不同 .

    • 我不确定为什么你的Lambda无法进行清理 . 我相信当一个S3 PUT发生在桶中时,你会尝试调用Lambda . 这应该能够清除JSON,除非涉及复杂的过程 .

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

    如果您可以分享创建大量分区时遇到的限制,那会很棒吗?

相关问题