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
Amazon web services 使用Athena中的单个表模式查询s3中预先创建的子文件夹_Amazon Web Services_Amazon S3_Amazon Athena - Fatal编程技术网

Amazon web services 使用Athena中的单个表模式查询s3中预先创建的子文件夹

Amazon web services 使用Athena中的单个表模式查询s3中预先创建的子文件夹,amazon-web-services,amazon-s3,amazon-athena,Amazon Web Services,Amazon S3,Amazon Athena,我正在探索AWS Athena以查询s3中的文件。我们有一个单独的服务,它以以下结构将数据写入s3: 资料 /日志1 /日志2 /日志3 所有文件都具有相同的架构。 以下是文件的架构: id(随机字符串id) 时间戳 价值观 然而,我们需要能够查询单个文件夹中的数据——log1、log2以及一起查询所有数据。 一个选项是为这些对象创建单独的表。但是,子文件夹log1、log2等对应于一个设备,它们可以是100或数千。这些名称是动态的,将由用户输入以供查询。此外,我们还需要其他查询功

我正在探索AWS Athena以查询s3中的文件。我们有一个单独的服务,它以以下结构将数据写入s3:

  • 资料
    • /日志1
    • /日志2
    • /日志3
所有文件都具有相同的架构。 以下是文件的架构:

  • id(随机字符串id)
  • 时间戳
  • 价值观
然而,我们需要能够查询单个文件夹中的数据——log1、log2以及一起查询所有数据。 一个选项是为这些对象创建单独的表。但是,子文件夹log1、log2等对应于一个设备,它们可以是100或数千。这些名称是动态的,将由用户输入以供查询。此外,我们还需要其他查询功能,如在两个时间戳之间查询数据等。此类查询将在/data文件夹级别触发

构造文件夹和相应表的好方法是什么?我已经阅读了多个建议分区的问题,但是对于我的用例,我并不真正理解如何对数据进行分区。我对雅典娜非常陌生,还在学习。任何建议都将不胜感激


提前感谢。

分区将影响每个查询扫描的数据量,从而提高性能并降低成本-下面是一个很好的解释:

您可以按任意键对数据进行分区。通常的做法是基于时间对数据进行分区,这通常会导致多级分区方案。例如,每小时都有数据进来的客户可能会决定按年、月、日期和小时进行分区。另一个客户的数据来自许多不同的来源,但每天加载一次,他可以按数据源标识符和日期进行分区

如果查询已分区的表并在WHERE子句中指定分区,则Athena只扫描来自该分区的数据

关于中的分区,还有一些很好的建议:

在决定要分区的列时,请考虑以下内容:

  • 用作筛选器的列是分区的最佳候选列
  • 分区是有代价的。随着表中分区数量的增加,检索和处理分区元数据的开销越高,文件越小。划分得太细可能会抵消最初的好处
  • 如果您的数据严重偏向一个分区值,并且大多数查询都使用该值,那么开销可能会抵消最初的好处
雅典娜最近发布了一个新功能,名为,它可能对您的情况有所帮助:

在分区投影中,分区值和位置是根据配置计算的,而不是从存储库(如AWS Glue数据目录)读取的。由于内存中的操作通常比远程操作快,分区投影可以减少针对高度分区表的查询的运行时间。

特别是在你的情况下,这个问题可能会很有趣

最终如何划分取决于查询及其设计方式:

  • 大多数查询都包含一个时间范围?然后你应该考虑日期作为分区
  • 大多数查询都会筛选特定设备(或少量ID)?那么,使用设备id作为分区或者至少尝试将这些分区绑定起来可能是一个更好的选择。还取决于每个设备的行数,以使其不太细粒度
  • 您还可以按日期和设备id进行分区
  • 因为您已经有了一个按设备划分的分区,所以我会在开始时使用投影来查询这些数据

是的,我今天确实浏览了文档,发现动态ID分区非常有效!但我不知道分区会产生成本。非常感谢您的详细回复。