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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

MSCK REPAIR TABLE

在添加 Hive 兼容分区后,使用 MSCK REPAIR TABLE 命令可更新目录中的元数据。

命令扫描文件系统(例如 MSCK REPAIR TABLE)以查找在创建表后添加到文件系统的与 Hive 兼容的分区。Amazon S3MSCK REPAIR TABLE 比较表元数据中的分区和 S3 中的分区。如果新分区存在于您在创建表时指定的 S3 位置,则会将这些分区添加到元数据和 Athena 表中。

添加物理分区时,目录中的元数据将变得与文件系统中的数据布局不一致,并且需要将有关新分区的信息添加到目录中。要更新元数据,请运行 MSCK REPAIR TABLE,以便您可以从 Athena 查询新分区中的数据。

注意

MSCK REPAIR TABLE 仅将分区添加到元数据中;不会删除分区。要在 Amazon S3 中手动删除分区后从元数据中删除分区,请运行命令 ALTER TABLE table-name DROP PARTITION。 有关更多信息,请参阅ALTER TABLE DROP PARTITION

注意事项和限制

在使用 MSCK REPAIR TABLE 时,请记住以下几点:

  • 添加所有分区可能需要一些时间。如果此操作超时,它将处于不完整的状态,其中只有少数分区会被添加到目录中。应在同一个表上运行 MSCK REPAIR TABLE 语句,直到添加所有分区。有关更多信息,请参阅分区数据.

  • 对于不兼容 Hive 的分区,请使用ALTER TABLE ADD PARTITION加载分区,以便您可以查询数据。

  • 要与 Athena 结合使用的分区位置必须使用 s3 协议(例如,s3://bucket/folder/). 在 Athena 中,当对包含的表运行 s3a://bucket/folder/ 查询时,使用其他协议的位置(例如,MSCK REPAIR TABLE)将导致查询失败。

  • 由于 MSCK REPAIR TABLE 会同时扫描文件夹的子文件夹以查找匹配的分区方案,因此,请确保将不同表的数据保存在单独的文件夹层次结构中。例如,假设您在 s3://table-a-data 中有表 A 的数据,在 s3://table-a-data/table-b-data 中有表 B 的数据。 如果两个表按字符串分区,MSCK REPAIR TABLE 会将表 B 的分区添加到表 A。为避免这种情况,请改用单独的文件夹结构,如 s3://table-a-datas3://table-b-data。请注意,此行为与 Amazon EMR 和 Apache Hive 一致。

  • 由于该命令遍历运行 Amazon S3 HeadObject 和 GetObject 命令的文件系统,因此,如果您的文件系统很大或包含大量数据,扫描的字节成本可能会很大。要估算成本,请参阅 Amazon S3 Amazon S3 和 AWS 定价计算器

Synopsis

MSCK REPAIR TABLE table_name

Examples

MSCK REPAIR TABLE orders;

Troubleshooting

在运行 MSCK REPAIR TABLE 后,如果 Athena 未将分区添加到 AWS Glue 数据目录 中的表,请检查以下内容:

  • 确保 AWS Identity and Access Management (IAM) 用户或角色具有允许执行 glue:BatchCreatePartition 操作的策略。

  • 确保 IAM 用户或角色拥有的策略具有访问 Amazon S3 的足够权限,包括 s3:DescribeJob 操作。有关允许哪些 Amazon S3 操作的示例,请参阅Athena 中对 Amazon S3 存储桶的跨账户访问中的示例存储桶策略。

  • 确保 Amazon S3 路径为小写而不是驼峰式大小写(例如, userid 而不是 userId).

  • 查询超时 首次创建表时,或者数据与分区元数据之间的奇偶校验不确定时,最好使用 – MSCK REPAIR TABLE。如果您使用 MSCK REPAIR TABLE 频繁添加新分区(例如,每天)并遇到查询超时,请考虑使用 ALTER TABLE ADD PARTITION

  • 文件系统中缺少的分区 – 如果在 Amazon S3 中手动删除分区,然后运行 MSCK REPAIR TABLE,您可能会收到错误消息 Partitions missing from filesystem, 出现这种情况的原因是 MSCK REPAIR TABLE 不会从表元数据中删除过时的分区。要从表元数据中删除已删除的分区,请运行 ALTER TABLE DROP PARTITION。请注意,SHOW PARTITIONS 类似地仅列出元数据中的分区,而不是文件系统中的分区。

以下部分提供了一些其他详细信息。

在 IAM 策略中允许 glue:BatchCreatePartition

查看附加到您用于运行 IAM 的用户或角色的 MSCK REPAIR TABLE 策略。 当您将 AWS Glue 数据目录与 Athena 一起使用时,IAM 策略必须允许 glue:BatchCreatePartition 操作。有关允许 IAM 操作的 glue:BatchCreatePartition 策略的示例,请参阅 AmazonAthenaFullAccess 托管策略.

将 Amazon S3 路径更改为小写

Amazon S3 路径必须为小写。如果 S3 路径为驼峰式大小写,则 MSCK REPAIR TABLE 不会将分区添加到 AWS Glue 数据目录. 例如,如果您的 S3 路径为 userId,则不会将以下分区添加到 AWS Glue 数据目录:

s3://bucket/path/userId=1/ s3://bucket/path/userId=2/ s3://bucket/path/userId=3/

要解决此问题,请使用全大写或全小写而不是驼峰式大小写:

s3://bucket/path/userid=1/ s3://bucket/path/userid=2/ s3://bucket/path/userid=3/