Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在S3中查询异构JSON数据?_Sql Server_Amazon S3_Amazon Redshift_Amazon Athena - Fatal编程技术网

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

Sql server 如何在S3中查询异构JSON数据?,sql-server,amazon-s3,amazon-redshift,amazon-athena,Sql Server,Amazon S3,Amazon Redshift,Amazon Athena,我们有一个AmazonS3存储桶,其中包含大约一百万个JSON文件,每个文件大约压缩500KB。这些文件由AWS Kinesis Firehose放在那里,每5分钟写入一个新文件。这些文件都描述了类似的事件,因此在逻辑上都是相同的,都是有效的JSON,但具有不同的结构/层次结构。此外,它们的格式和行尾不一致:一些对象在一行上,一些在多行上,有时一个对象的结尾与另一个对象的开头在同一行上(即,}{) 我们需要解析/查询/分解这些对象,然后将结果导入本地数据仓库SQL Server数据库 Amazo

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

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

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

我已经研究过先将数据注入Redshift,然后再将其向下拉。Amazon Redshift外部表可以处理间距问题,但不能处理嵌套JSON,这几乎所有这些文件都有。
COPY
命令可以处理嵌套JSON,但要求我们事先知道JSON结构,并且不允许我们访问ss文件名,我们需要它来完成导入(这是我们获取日期的唯一方法)。一般来说,红移与雅典娜有相同的问题:不一致的结构使得定义模式变得困难

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

我尝试过省去中间人,使用ZappySys的S3JSON SSIS任务直接提取文件并将其聚合到SSIS包中,但它无法处理间距问题或不一致的结构


我不可能是第一个面对这个问题的人,但我只是不断地旋转轮子。

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

  • 我相信MongoDB/DynamoDB/Cassandra擅长处理异构JSON结构。我不确定ur JSON中的不一致性,但只要它是一个有效的JSON,我相信它应该可以在上面的一个DBs中摄取。如果可能的话,请提供一个JSON示例。但这些工具都有自己的优缺点。数据对于这些非SQL,odelling与传统SQL完全不同
  • 我不知道为什么您的Lambda无法进行清理。我相信您会在存储桶中发生S3 PUT时尝试调用Lambda。这应该能够清理JSON,除非涉及复杂的进程
  • 除非JSON采用正确的格式,否则没有任何工具能够完美地处理它,我相信除了Athena或Spectrum之外,MongoDB/DyanoDB/Cassandra更适合这个用例

    如果您能分享创建大量分区时所面临的限制,那就太好了。

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

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


    更新:Rumble还适用于拼花地板、CSV、ROOT、AVRO、text和SVM,以及HDFS、S3和Azure。

    为什么要首先向Kinesis消防软管发送不一致的数据?您能将数据发送到几个不同的消防软管,以便每个消防软管接收一致的数据,然后您可以查询这些数据吗?@JohnRotenstein我不反对l数据进入S3。我正在与客户端合作,以使数据更加一致,但这将是一个不断变化的目标,仍然留给我如何处理现有数据的问题。我更新了问题,以澄清分区和格式。我正在使用MongoDB进行我需要的转换,它工作得很好。谢谢s!谢谢,很高兴听到。Mongo有设置集群的麻烦。如果您在AWS中,请尝试使用DynamoDB,这样您就不需要维护任何infra;但是DynamoDB没有Mongo支持的所有功能(嵌入式数据结构)并且具有更好的可扩展性和易维护性。该公司已经使用Mongo作为一项服务,因此我可以借助它。