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



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

  • 数据
    • /log1
    • /log2
    • /log3

所有文件都具有相同的架构。以下是文件的模式:

  • id(随机字符串id(
  • 时间戳
  • 价值

然而,我们需要能够查询单个文件夹中的数据——log1、log2,同时查询所有数据。一种选择是为它们创建单独的表。然而,子文件夹log1、log2等对应于一个设备,并且这些子文件夹的数量可以是100或数千。这些名称将是动态的,并且将由用户输入以进行查询。此外,我们还需要其他查询功能,例如查询两个时间戳之间的数据等。此类查询将在/data文件夹级别激发。

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

提前谢谢。

分区将影响每个查询扫描的数据量,从而提高性能并降低成本-可以在AWS分区数据:中找到一个很好的解释

您可以通过任何键对数据进行分区。一种常见的做法是根据时间对数据进行分区,通常会产生多级分区方案。例如,每小时都有数据进入的客户可能会决定按年、月、日期和小时进行分区。另一个客户拥有来自许多不同来源的数据,但每天加载一次,可以通过数据源标识符和日期进行分区。

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

在AWS Athena的前10个性能调整提示中也有一些关于分区的好建议:

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

  • 用作筛选器的列是分区的好候选者
  • 分区是有代价的。随着表中分区数量的增加,检索和处理分区元数据的开销就越高,文件也就越小。分区过于精细可能会抹杀最初的好处
  • 如果您的数据严重偏向于一个分区值,并且大多数查询都使用该值,那么开销可能会抵消最初的好处

Athena最近发布了一项名为分区投影的新功能,这可能对您的情况有所帮助:

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

特别是动态ID分区在您的情况下可能会很有趣。

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

  • 大多数查询都包含一个时间框架?那么你应该把日期看作一个分区
  • 大多数查询都过滤特定设备(或少量id(?然后,使用设备id作为分区可能是一个更好的选择,或者至少尝试对这些分区进行分组。还取决于每个设备的行数,以免使其过于精细
  • 您还可以按日期和设备id进行分区
  • 由于您已经有了一个按设备划分的分区,我会在一开始就这样做,并使用投影来查询这些数据

最新更新