分桶与分区 - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

分桶与分区

您可以指定分区和分桶,用于在 Amazon S3 中存储 CTAS 查询生成的数据。有关 CTAS 查询的更多信息,请参阅 CREATE TABLE AS SELECT (CTAS)

本节讨论仅适用于 CTAS 查询的分区和分桶。有关在 CREATE TABLE 查询中使用分区的一般准则,请参阅 Amazon Athena 的最佳性能调整技巧

使用以下提示来决定是否分区和/或配置分桶,然后选择在 CTAS 查询中用作操作依据的列:

  • CTAS 查询结果分区 在您计划使用的分区数有限时非常适用。当您运行 CTAS 查询时,Athena 将结果写入 Amazon S3 中的指定位置。如果您指定分区,查询创建分区并将每个分区存储在相同位置的单独分区文件夹中。可使用一个查询中的 CTAS 查询结果配置的最大分区数是 100。但是,您可以绕过此限制。有关更多信息,请参阅使用 CTAS 和 INSERT INTO 创建带 100 多个分区的表

    在 Amazon S3 中进行分区有助于 Athena 查询性能,因为这可以帮助您仅针对特定分区运行定向查询。随后,Athena 可以仅扫描这些分区,节省您的查询成本和查询时间。有关分区语法的信息,请在 CREATE TABLE AS 中搜索 partition_by

    按照具有相同特性(例如来自相同部门的记录)以及可能值的数量有限(例如,某个组织中的不同部门数有限)的列分区数据。此特性称为数据基数。例如,如果您按列 department 分区数据,并且此列具有有限数量的不同值,按 department 分区可以很好地工作,减少查询延迟。

  • CTAS 查询结果分桶 非常适合按照具有高基数并且均匀分布值的列来分桶存储数据。

    例如,存储 timestamp 数据的列可能具有大量的非重复值,并且其数据在整个数据集中均匀分布。这意味着存储 timestamp 类型数据的列很可能具有值,不会为 null。这也意味着,来自这样列的数据可以放在多个存储桶中,每个存储桶在 Amazon S3 中存储大约相同的数据量。

    要选择用于 CTAS 查询结果分桶依据的列,请使用具有大量值(高基数)并且其数据可以拆分为大致相同的数据量存储在多个存储桶中的列。稀疏填充的列不适合作为分桶的依据。这是因为您最后会遇到一些存储桶具有少量数据,而另一项存储桶具有大量数据。相比而言,预期几乎总是有值的列(例如 timestamp 类型值)非常适合用于分桶。这是因为其数据具有高基数并且可以按照大致相同的分块存储。

    有关分桶语法的更多信息,请在 CREATE TABLE AS 中搜索 bucketed_by

总结而言,对于同一个 CTAS 查询,您可以分区并使用分桶来存储结果。这些写入数据的技术并不彼此排斥。通常情况下,您用于分桶的列不同于用于分区的列。

例如,如果您的数据集包含列 departmentsales_quarterts (用于存储 timestamp 类型数据),您可以按 departmentsales_quarter 对 CTAS 查询结果进行分区。这些列的值基数相对较低:部门和销售季度数量有限。另外,对于分区,如果数据集中的某些记录具有 null 或者没有为这些列分配值,这无关紧要。重要的是,具有相同特性的数据(例如来自同一个部门的数据)将位于同一个分区,可在 Athena 中查询。

与此同时,由于所有数据具有存储在 ts 列中的 timestamp 类型值,您可以按照列 ts 为同一个查询结果配置分桶。此列具有较高的基数。您可以将其数据存储在 Amazon S3 内的多个存储桶中。请考虑相反的场景:如果您没有为时间戳类型数据创建存储桶,然后为特定日期或时间值运行查询,那么就需要扫描存储在 Amazon S3 中单个位置的非常大量的数据。相反,如果您配置存储桶来存储与日期和时间相关的结果,您可以只扫描和查询具有您的值的存储桶,避免扫描大量数据的长时间运行查询。