MSCK REPAIR TABLE
在添加与 Hive 兼容的分区后,使用 MSCK REPAIR TABLE 命令可更新目录中的元数据。
MSCK REPAIR TABLE 命令将扫描在创建表后被添加到文件系统且兼容 Hive 的分区文件系统(例如 Amazon S3)。MSCK REPAIR TABLE 将比较表元数据中的分区和 S3 中的分区。如果您在创建表时指定的 S3 位置中存在新分区,则表会将这些分区添加到元数据和 Athena 表中。
在添加物理分区时,目录中的元数据将变得与文件系统中的数据布局不一致,需要将有关新分区的信息添加到目录中。要更新元数据,请运行 MSCK REPAIR TABLE 以便从 Athena 查询新分区中的数据。
MSCK REPAIR TABLE 仅向元数据添加分区;它不会删除它们。要在 Amazon S3 中手动删除分区后从元数据中删除分区,请运行命令 ALTER TABLE 。有关更多信息,请参阅 ALTER TABLE DROP
PARTITION。table-name DROP
PARTITION
注意事项和限制
在使用 MSCK REPAIR TABLE 时,请记住以下几点:
-
添加所有分区可能需要一些时间。如果此操作超时,它将处于不完整的状态,其中只有少数分区会被添加到目录中。应在同一个表上运行
MSCK REPAIR TABLE语句,直到添加所有分区。有关更多信息,请参阅在 Athena 中对数据进行分区。 -
对于不兼容 Hive 的分区,请使用ALTER TABLE ADD PARTITION加载分区,以便您可以查询数据。
-
要与 Athena 结合使用的分区位置必须使用
s3协议(例如,s3://)。在 Athena 中,当对包含的表运行bucket/folder/MSCK REPAIR TABLE查询时,使用其他协议的位置(例如,s3a://)将导致查询失败。bucket/folder/ -
由于
MSCK REPAIR TABLE同时扫描文件夹及其子文件夹以查找匹配的分区方案,请确保在单独的文件夹层次结构中保留单独表的数据。例如,假设您在s3://table-a-data中拥有表 A 的数据,在s3://table-a-data/table-b-data中拥有表 B 的数据. 如果两个表都按字符串进行分区,MSCK REPAIR TABLE会将表 B 的分区添加到表 A。为了避免这种情况,请使用单独的文件夹结构,如s3://table-a-data和s3://table-b-data。请注意,此行为与 Amazon EMR 和 Apache Hive 一致。 -
由于已知问题,当分区值包含冒号(
:)字符时(例如,当分区值为一个时间戳时)MSCK REPAIR TABLE会静默失败。一个解决方法是使用 ALTER TABLE ADD PARTITION。
摘要
MSCK REPAIR TABLE table_name
示例
MSCK REPAIR TABLE orders;
问题排查
运行 MSCK REPAIR TABLE 后,如果 Athena 未将分区添加到 Amazon Glue Data Catalog 中的表,请检查以下内容:
-
确保 Amazon 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 将类似地仅列出元数据中的分区,而不是文件系统中的分区。 -
“NullPointerException name is null(NullPointerException 名称为空)”错误
如果您将 Amazon Glue CreateTable API 操作或 Amazon CloudFormation
AWS::Glue::Table模板创建用于 Athena 的表,而不指定TableType属性,然后运行 DDL 查询,如SHOW CREATE TABLE或者MSCK REPAIR TABLE,则您将收到错误消息FAILED: NullPointerException Name is null(失败:NullPointerException 名称为空)。要纠正该错误,请为 TableInput
TableType属性指定值,使其作为 Amazon GlueCreateTableAPI 调用或 Amazon CloudFormation 模板的一部分。TableType可能的值包括EXTERNAL_TABLE或VIRTUAL_VIEW。此要求仅适用于使用 Amazon Glue
CreateTableAPI 操作或AWS::Glue::Table模板创建表的情形。如果您适用 DDL 语句或 Amazon Glue 爬网程序为 Athena 创建表,则TableType属性将自动定义。
以下各节提供了一些详细信息。
在 IAM policy 中允许 glue:BatchCreatePartition
审核附加到您用于执行 MSCK REPAIR TABLE 的用户或角色的 IAM policy。当您将 Amazon Glue Data Catalog 与 Athena 一起使用时,IAM policy 必须允许 glue:BatchCreatePartition 操作。有关允许 glue:BatchCreatePartition 操作的 IAM policy 的示例,请参阅 Amazon 托管策略:AmazonAthenaFullAccess。
将 Amazon S3 路径更改为小写
Amazon S3 路径必须为小写。如果 S3 路径为驼峰式大小写,则 MSCK
REPAIR TABLE 不会将分区添加到 Amazon Glue Data Catalog。例如,如果您的 S3 路径为 userId,则不会将以下分区添加到 Amazon Glue Data Catalog:
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/