MSCK REPAIR TABLE
Verwenden Sie den MSCK REPAIR TABLE-Befehl, um die Metadaten im Katalog zu aktualisieren, nachdem Sie mit Hive kompatible Partitionen hinzugefügt haben.
Der MSCK REPAIR TABLE-Befehl durchsucht ein Dateisystem, z. B., Amazon S3, nach mit Hive kompatiblen Partitionen, die dem Dateisystem hinzugefügt wurden, nachdem die Tabelle erstellt wurde. MSCK REPAIR TABLE vergleicht die Partitionen in den Tabellenmetadaten und die Partitionen in S3. Wenn neue Partitionen am S3-Speicherort vorhanden sind, den Sie beim Erstellen der Tabelle angegeben haben, werden diese Partitionen den Metadaten und der Athena-Tabelle hinzugefügt.
Wenn Sie physische Partitionen hinzufügen, werden die Metadaten im Katalog mit dem Layout der Daten im Dateisystem inkonsistent und Informationen über die neuen Partitionen müssen dem Katalog hinzugefügt werden. Um die Metadaten zu aktualisieren, führen Sie MSCK REPAIR TABLE aus, damit Sie die Daten in den neuen Partitionen von Athena abfragen können.
Anmerkung
MSCK REPAIR TABLE fügt nur Partitionen zu Metadaten hinzu; sie werden nicht entfernt. Um Partitionen aus den Metadaten zu entfernen, nachdem die Partitionen in Amazon S3 manuell gelöscht wurden, führen Sie den Befehl aus ALTER TABLE . Weitere Informationen finden Sie unter ALTER TABLE DROP
PARTITION. table-name DROP
PARTITION
Überlegungen und Einschränkungen
Beachten Sie bei der Verwendung von MSCK REPAIR TABLE die folgenden Punkte:
-
Möglicherweise dauert es etwas, bis alle Partitionen hinzugefügt wurden. Wird das Zeitlimit für diese Operation überschritten, ist der Status "unvollständig", da nur einige Partitionen zum Katalog hinzugefügt wurden. Führen Sie
MSCK REPAIR TABLEfür dieselbe Tabelle so lange aus, bis alle Partitionen hinzugefügt wurden. Weitere Informationen finden Sie unter Ihre Daten partitionieren. -
Verwenden Sie für nicht mit Hive kompatible Partitionen ALTER TABLE ADD PARTITION, um sie zu laden und ihre Daten abzufragen.
-
Partitionsspeicherorte zur Verwendung mit Athena müssen das
s3-Protokoll verwenden (z. B.s3://amzn-s3-demo-bucket/). In Athena führen Speicherorte, die andere Protokolle verwenden (z. B.folder/s3a://), zu Abfragefehlern, wennbucket/folder/MSCK REPAIR TABLE-Abfragen für die enthaltenen Tabellen ausgeführt werden. -
Da es sich bei
MSCK REPAIR TABLEdurchsucht sowohl einen Ordner als auch seine Unterordner, um ein übereinstimmendes Partitionsschema zu finden. Achten Sie darauf, dass die Daten für separate Tabellen in separaten Ordnerhierarchien aufbewahrt werden. Angenommen, Sie haben Daten für Tabelle 1 ins3://amzn-s3-demo-bucket1und Daten für Tabelle 2 ins3://amzn-s3-demo-bucket1/table-2-data. Wenn beide Tabellen nach einer Zeichenfolge partitioniert sind, wirdMSCK REPAIR TABLEdie Partitionen für Tabelle 2 zu Tabelle 1 hinzufügen. Um dies zu vermeiden, verwenden Sie stattdessen separate Ordnerstrukturen wies3://amzn-s3-demo-bucket1unds3://amzn-s3-demo-bucket2. Beachten Sie, dass dieses Verhalten mit Amazon EMR und Apache Hive konsistent ist. -
Aufgrund eines bekannten Problems schlägt
MSCK REPAIR TABLEohne Fehlermeldung fehl, wenn Partitionswerte einen Doppelpunkt (:) enthalten (wenn der Partitionswert z. B. ein Zeitstempel ist). Als Problemumgehung verwenden Sie ALTER TABLE ADD PARTITION. -
MSCK REPAIR TABLEfügt keine Partitionsspaltennamen hinzu, die mit einem Unterstrich (_) beginnen. Verwenden Sie ALTER TABLE ADD PARTITION, um dieses Limit zu umgehen.
Syntax
MSCK REPAIR TABLE table_name
Beispiele
MSCK REPAIR TABLE orders;
Fehlerbehebung
Nachdem Sie MSCK REPAIR TABLE ausgeführt haben, überprüfen Sie Folgendes, wenn Athena die Partitionen nicht der Tabelle in AWS Glue Data Catalog hinzugefügt hat:
-
AWS Glue-Zugriff – Stellen Sie sicher, dass die AWS Identity and Access Management (IAM)-Rolle über eine Richtlinie verfügt, die die
glue:BatchCreatePartition-Aktion zulässt. Weitere Informationen finden Sie unter glue:BatchCreatePartition in der IAM-Richtlinie zulassen an späterer Stelle in diesem Dokument. -
Amazon-S3-Zugriff – Stellen Sie sicher, dass die Rolle über eine Richtlinie mit ausreichenden Berechtigungen für den Zugriff auf Amazon S3 verfügt, einschließlich der
s3:DescribeJob-Aktion. Ein Beispiel dafür, welche Amazon-S3-Aktionen zulässig sind, finden Sie in der Beispiel-Bucket-Richtlinie in Kontoübergreifender Zugriff auf Amazon-S3-Buckets in Athena konfigurieren. -
Amazon-S3-Objektschlüssel-Case-Schreibweise – Achten Sie darauf, dass der Amazon-S3-Pfad in Kleinbuchstaben und nicht mit der Camel-Case-Schreibweise geschrieben ist (z. B.
useridstattuserId), oder verwenden SieALTER TABLE ADD PARTITION, um die Objektschlüsselnamen anzugeben. Weitere Informationen finden Sie unter Den Amazon-S3-Pfad ändern oder neu definieren an späterer Stelle in diesem Dokument. -
Zeitüberschreitungen bei Abfragen –
MSCK REPAIR TABLEwird am besten verwendet, wenn eine Tabelle zum ersten Mal erstellt wird oder wenn Unsicherheit bezüglich der Parität zwischen Daten und Partitionsmetadaten besteht. Wenn SieMSCK REPAIR TABLEverwenden, um häufig neue Partitionen hinzuzufügen (z. B. täglich) und Abfragezeitüberschreitungen auftreten, sollten Sie ALTER TABLE ADD PARTITION verwenden. -
Partitionen, die im Dateisystem fehlen – Wenn Sie eine Partition manuell in Amazon S3 löschen und dann
MSCK REPAIR TABLEausführen, erhalten Sie möglicherweise die FehlermeldungPartitionen fehlen im Dateisystem. Dies tritt auf, weilMSCK REPAIR TABLEkeine veralteten Partitionen aus den Tabellenmetadaten entfernt. Um die gelöschten Partitionen aus den Tabellenmetadaten zu entfernen, führen Sie stattdessen ALTER TABLE DROP PARTITION aus. Beachten Sie, dass SHOW PARTITIONS ebenfalls nur die Partitionen in den Metadaten auflistet, nicht die Partitionen im Dateisystem. -
"Fehler „NullPointerException-Name is null
Wenn Sie den AWS Glue-API-Vorgang CreateTable oder die CloudFormation-Vorlage
AWS::Glue::Tableverwenden, um eine Tabelle zur Verwendung in Athena zu erstellen, ohne dieTableType-Eigenschaft anzugeben und dann eine DDL-Abfrage wieSHOW CREATE TABLEoderMSCK REPAIR TABLEausführen, können Sie die FehlermeldungFEHLGESCHLAGEN: NullPointerException-Name ist Nullanzeigen.Um den Fehler zu beheben, geben Sie einen Wert für das TableInput
TableType-Attribut als Teil des AWS Glue-API-AufrufsCreateTableoder der z-CloudFormation Vorlage an. Mögliche Werte fürTableTypesindEXTERNAL_TABLEoderVIRTUAL_VIEW.Diese Anforderung gilt nur, wenn Sie eine Tabelle mit dem AWS Glue-API-Vorgang
CreateTableoder derAWS::Glue::Table-Vorlage erstellen. Wenn Sie eine Tabelle für Athena mithilfe einer DDL-Anweisung oder eines AWS Glue-Crawlers erstellen, wird dieTableType-Eigenschaft automatisch für Sie definiert.
In den folgenden Abschnitten finden Sie zusätzliche Informationen.
glue:BatchCreatePartition in der IAM-Richtlinie zulassen
Überprüfen Sie die IAM-Richtlinien, die der Rolle zugeordnet sind, die Sie zum Ausführen von verwenden MSCK
REPAIR TABLE. Wenn Sie den AWS Glue Data Catalog mit Athena verwenden, muss die IAM-Richtlinie die Aktion glue:BatchCreatePartition zulassen. Ein Beispiel für eine IAM-Richtlinie, die die Aktion glue:BatchCreatePartition zulässt, finden Sie unter AWS Verwaltete Richtlinie: AmazonAthenaFullAccess.
Den Amazon-S3-Pfad ändern oder neu definieren
Wenn ein oder mehrere Objektschlüssel im Amazon-S3-Pfad in Großbuchstaben statt in Kleinbuchstaben geschrieben sind, werden die MSCK REPAIR TABLE möglicherweise nicht zur AWS Glue Data Catalog hinzugefügt. Wenn Ihr Amazon-S3-Pfad beispielsweise den Objektschlüsselnamen userId enthält, werden die folgenden Partitionen möglicherweise nicht zur AWS Glue Data Catalog hinzugefügt:
s3://amzn-s3-demo-bucket/path/userId=1/ s3://amzn-s3-demo-bucket/path/userId=2/ s3://amzn-s3-demo-bucket/path/userId=3/
Sie lösen dieses Problem, indem Sie einen der folgenden Schritte ausführen:
-
Verwenden Sie Kleinbuchstaben statt Großbuchstaben, wenn Sie Ihre Amazon-S3-Objektschlüssel erstellen:
s3://amzn-s3-demo-bucket/path/userid=1/ s3://amzn-s3-demo-bucket/path/userid=2/ s3://amzn-s3-demo-bucket/path/userid=3/ -
Verwenden Sie ALTER TABLE ADD PARTITION, um den Standort neu zu definieren, wie im folgenden Beispiel:
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION (userId=1) LOCATION 's3://amzn-s3-demo-bucket/path/userId=1/' PARTITION (userId=2) LOCATION 's3://amzn-s3-demo-bucket/path/userId=2/' PARTITION (userId=3) LOCATION 's3://amzn-s3-demo-bucket/path/userId=3/'
Beachten Sie, dass Amazon-S3-Objektschlüsselnamen zwar Großbuchstaben verwenden können, die Amazon-S3-Bucket-Namen selbst jedoch immer in Kleinbuchstaben geschrieben werden müssen. Weitere Informationen finden Sie unter Richtlinien zur Benennung von Objektschlüsseln und Regeln zur Benennung von Buckets im Amazon-S3-Benutzerhandbuch.