【发布时间】:2018-05-08 22:16:07
【问题描述】:
我们有一个 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 包中,但它无法处理间距问题或结构不一致的问题。
我不能成为第一个遇到这个问题的人,但我只是不停地旋转。
【问题讨论】:
-
为什么首先要向 Kinesis Firehose 发送不一致的数据?您能否改为将数据发送到几个不同的 Firehose,以便每个 Firehose 接收到您可以查询的一致数据?
-
@JohnRotenstein 我无法控制进入 S3 的数据。我正在与客户合作以使数据更加一致,但这将是一个不断变化的目标,并且仍然给我留下了如何处理现有数据的问题。
标签: sql-server amazon-s3 amazon-redshift amazon-athena