Direkt zum Inhalt

Warum erhalte ich keine Datensätze, wenn ich meine Amazon-Athena-Tabelle abfrage?

Lesedauer: 6 Minute
0

Ich habe in Amazon Athena eine CREATE-TABLE (Tabelle erstellen)-Anweisung mit den erwarteten Spalten und ihren Datentypen ausgeführt. Wenn ich jedoch die Tabellennamenabfrage „SELECT * FROM“ ausführe, erhalte ich die Ausgabe „Zero records returned“.

Lösung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Es gibt mehrere Gründe, warum die Tabellennamenabfrage „SELECT\ * FROM“ möglicherweise keine Datensätze zurückgibt. Je nach Anwendungsfall findest du im entsprechenden Abschnitt häufig auftretende Gründe und Schritte zur Problembehandlung.

Problembehandlung bei AWS-Glue-Partitionen

Überprüfen deiner Crawler-Einstellungen

Wenn du einen Crawler verwendest, stelle sicher, dass der Crawler auf den Amazon Simple Storage Service (Amazon S3)-Bucket verweist und nicht auf eine bestimmte Datei. Verwende beispielsweise s3://amzn-s3-demo-bucket/new anstelle von s3://amzn-s3-demo-bucket/new/data.json.

Verwenden des richtigen LOCATION (Speicherort)-Pfads

Stelle sicher, dass der Amazon-S3-LOCATION-Pfad für die Eingabedaten korrekt ist. Stelle außerdem sicher, dass der S3-Bucket-Pfad keine Datei oder Platzhalter enthält. Verwende beispielsweise die s3://amzn-s3-demo-bucket/new-LOCATION anstelle von s3://amzn-s3-demo-bucket/new/data.json.

Verwenden eines einzelnen Schrägstrichs im LOCATION-Pfad

In Athena kannst du keine Pfade für Tabellenspeicherorte verwenden, die einen doppelten Schrägstrich (//) enthalten. Beispielsweise gibt der folgende LOCATION-Pfad leere Ergebnisse zurück: s3://amzn-s3-demo-bucket/myprefix//input//

Um die Dateien an einen Speicherort ohne doppelte Schrägstriche zu kopieren, führe den folgenden cp-AWS-CLI-Befehl aus:

aws s3 cp s3://amzn-s3-demo-bucket/myprefix//input// s3://amzn-s3-demo-bucket/myprefix/input/ --recursive

Hinweis: Ersetze amzn-s3-demo-bucket/myprefix//input// durch deinen aktuellen Pfad zum Speicherort der Tabelle und amzn-s3-demo-bucket/myprefix/input/ durch deinen neuen Pfad zum Speicherort der Tabelle.

Es hat sich bewährt, nur Unterstriche oder Großbuchstaben in die Spaltennamen der Tabelle aufzunehmen. Du kannst beispielsweise einer Spalte den Namen table_name geben, nicht aber den Namen table-name.

Hinweis: AWS Glue und Athena können keine Binnenmajuskeln, Großbuchstaben oder Sonderzeichen außer dem Unterstrich lesen.

Erstellen von Amazon-S3-Präfixen für jede Tabelle

AWS-Glue-Crawler erstellen separate Tabellen für Daten, die im selben Amazon-S3-Präfix gespeichert sind. Wenn du diese Tabellen jedoch in Athena abfragst, erhältst du keine Datensätze. Die Athena-Abfrage gibt beispielsweise keine Datensätze zurück, wenn der Tabellenspeicherort den folgenden Beispielen ähnelt:

  • s3://amzn-s3-demo-bucket/table1.csv
  • s3://amzn-s3-demo-bucket/table2.csv

Um dieses Problem zu lösen, erstelle für jede Tabelle individuelle Amazon-S3-Präfixe, ähnlich wie in den folgenden Beispielen:

  • s3://amzn-s3-demo-bucket/table1/table1.csv
  • s3://amzn-s3-demo-bucket/table2/table2.csv

Führe dann die folgende Abfrage aus, um den Speicherort für die Tabelle zu aktualisieren:

ALTER TABLE table1 SET LOCATION 's3://amzn-s3-demo-bucket/table1';

Hinweis: Ersetze amzn-s3-demo-bucket durch deinen Bucket-Namen und table1 durch deinen Tabellennamen.

Laden der Partitionen

Athena erstellt Metadaten nur, wenn du eine Tabelle erstellst. Die Daten werden nur analysiert, wenn du die Abfrage ausführst. Wenn die Tabelle definierte Partitionen hat, hat AWS Glue Data Catalog oder der interne Athena-Datenkatalog die Partitionen möglicherweise nicht geladen.

Wenn Athena das Format der Partitionen unterstützt, führe MSCK REPAIR TABLE aus, um die Metadaten einer Partition in den Katalog zu laden. Du hast beispielsweise eine Tabelle, die nach Jahr partitioniert ist. In diesem Fall erwartet Athena, die Daten auf Amazon-S3-Pfaden zu finden, ähnlich wie in den folgenden Beispielen:

  • s3://amzn-s3-demo-bucket/athena/inputdata/year=2020/data.csv
  • s3://amzn-s3-demo-bucket/athena/inputdata/year=2019/data.csv
  • s3://amzn-s3-demo-bucket/athena/inputdata/year=2018/data.csv

Wenn die Daten auf den Amazon-S3-Pfaden existieren, die Athena erwartet, repariere die Tabelle mit einem Befehl, der dem folgenden ähnelt:

CREATE EXTERNAL TABLE Employee (    Id INT,    
    Name STRING,
    Address STRING
) PARTITIONED BY (year INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/';

Nachdem Athena die Tabelle erstellt hat, führe den folgenden Befehl aus, um die Partitionsinformationen zu laden:

MSCK REPAIR TABLE Employee;

Nachdem Athena die Daten geladen hat, führe die folgende Abfrage erneut aus:

SELECT * FROM Employee;

Wenn Athena das Format der Partitionen nicht unterstützt oder sich die Partitionen in unterschiedlichen Amazon-S3-Pfaden befinden, führe ALTER TABLE ADD PARTITION für jede Partition aus.

Die Daten befinden sich beispielsweise in diesen Amazon-S3-Beispielpfaden:

  • s3://amzn-s3-demo-bucket/athena/inputdata/2020/data.csv
  • s3://amzn-s3-demo-bucket/athena/inputdata/2019/data.csv
  • s3://amzn-s3-demo-bucket/athena/inputdata/2018/data.csv

Führe für die vorherigen Pfade einen Befehl aus, der dem folgenden Beispiel ähnelt:

ALTER TABLE Employee ADD PARTITION (year=2020) LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/2020/'
    PARTITION (year=2019) LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/2019/'
    PARTITION (year=2018) LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/2018/'

Nachdem Athena die Daten geladen hat, führe die folgende Abfrage erneut aus:

SELECT * FROM Employee;

Überprüfen der Dateinamen

Stelle sicher, dass die Dateinamen nicht mit einem Unterstrich oder Punkt beginnen.

Wenn du eine Abfrage verarbeitest, betrachtet Athena diese Dateien als Platzhalter und ignoriert sie. Wenn alle Dateien im Amazon-S3-Pfad Namen haben, die mit einem Unterstrich oder Punkt beginnen, erhältst du keine Datensätze.

Wenn du beispielsweise eine Abfrage mit den folgenden Dateien im Amazon-S3-Pfad verarbeitest, erhältst du keine Datensätze:

  • s3://amzn-s3-demo-bucket/athena/inputdata/_file1
  • s3://amzn-s3-demo-bucket/athena/inputdata/.file2

Hinweis: Wenn der Amazon-S3-Pfad Platzhalter und Dateien enthält, die mit anderen Zeichen beginnen, ignoriert Athena nur die Platzhalter und fragt die anderen Dateien ab. Infolgedessen erhältst du möglicherweise einen oder mehrere Datensätze.

Problembehandlung bei der Partitionsprojektion

Sich vergewissern, dass die Werte innerhalb der Bereichsgrenzen liegen

Wenn die Werte außerhalb der für die Partitionsprojektion definierten Bereichsgrenzen liegen, gibt die Abfrage keine Zeilen zurück.

Die Daten beginnen beispielsweise im Jahr 2020 und du definierst sie wie folgt: projection.timestamp.range'='2020/01/01,NOW

Wenn du die folgende Abfrage ausführst, wird die Abfrage erfolgreich abgeschlossen, es werden jedoch keine Zeilen zurückgegeben:

SELECT * FROM table-name WHERE timestamp = '2019/02/02'

Überprüfen des Partitionierungsschemas der Speichervorlage

Wenn der Amazon-S3-Speicherort nicht das Speicherortmuster .../column=value... verwendet, musst du ein benutzerdefiniertes Amazon-S3-Partitionierungsschema angeben. Wenn du kein benutzerdefiniertes Schema definierst, gibt die Abfrage keine Datensätze zurück.

Verwenden der richtigen benutzerdefinierten Speichervorlage

Wenn du eine benutzerdefinierte Vorlage verwendest, stelle sicher, dass die Vorlage es Athena ermöglicht, die Partitionsspeicherorte zu erstellen. Stelle außerdem sicher, dass jeder Platzhalter und der Amazon-S3-Pfad mit einem einzigen Schrägstrich enden.

Du definierst beispielsweise eine Partitionsspalte nach Jahr mit der Datenbeschreibungssprach (DDL)-Anweisung PARTITIONED BY (year string), und der Speicherort ist s3://amzn-s3-demo-bucket/athena/inputdata/Year=2022/. Dieser Speicherort gibt keine Datensätze zurück. Um dieses Problem zu beheben, aktualisiere den Speicherort auf s3://amzn-s3-demo-bucket/athena/inputdata/Year=${year}.

Überprüfen der Partitionseigenschaften

Wenn du Partitionsspalten mit den Partitionsspaltentypen Aufzählung, ganze Zahl, Datum oder eingefügt hast, stelle sicher, dass du die Partitionseigenschaften richtig konfigurierst. Die Konfiguration muss es Athena ermöglichen, Partitionsspeicherorte zu erstellen, die der Struktur der Daten auf Amazon S3 entsprechen.

Du verfügst beispielsweise über zeitbezogene Daten, die täglich 1 Stunde nach Mitternacht am Speicherort s3://amzn-s3-demo-bucket/athena/inputdata/2022-01-01-01-00 eingehen.

In diesem Beispiel verwendet die Athena-Tabelle die folgenden Partitionseigenschaften:

'projection.dt.format' = 'yyyy-MM-dd-HH-mm','projection.dt.range' = '2022-01-01-00-00,NOW',
'projection.dt.interval' = '1',
'projection.dt.interval.unit' = 'DAYS'

Abfragen, die in der Beispieltabelle ausgeführt werden, geben keine Datensätze zurück, da die Dateispeicherorte der Eigenschaft „Mitternacht“ entsprechen s3://amzn-s3-demo-bucket/athena/inputdata/2022-01-01-00-00.

Um dieses Problem zu beheben, setze die Eigenschaft projection.dt.range auf 2022-01-01-01-00,NOW.

Ähnliche Informationen

Erstellen von Tabellen in Athena

Verwenden eines Crawlers, um eine Tabelle hinzuzufügen

Einrichten von Partitionsprojektionen

AWS OFFICIALAktualisiert vor 7 Monaten