分桶与分区 - 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 中搜索 partitioned_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 中单个位置的非常大量的数据。相反,如果您配置存储桶来存储与日期和时间相关的结果,您可以只扫描和查询具有您的值的存储桶,避免扫描大量数据的长时间运行查询。