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-Anweisung mit den erwarteten Spalten und ihren Datentypen ausgeführt. Wenn ich die Abfrage WÄHLEN * AUS Tabellenname ausführe, lautet die Ausgabe „Es wurden keine Datensätze zurückgegeben.“

Auflösung

Es gibt mehrere häufige Gründe, warum die Abfrage null Datensätze zurückgibt. Je nach Anwendungsfall finden Sie im entsprechenden Abschnitt häufig auftretende Gründe und Schritte zur Fehlerbehebung.

AWS Glue-Partitionen

In den Crawler-Einstellungen ausgewählte Datei

Wenn Sie einen Crawler verwenden, vergewissern Sie sich, dass der Crawler auf den Amazon Simple Storage Service (Amazon S3)-Bucket und nicht auf eine Datei verweist.

Falscher LOCATION-Pfad

Überprüfen Sie den Amazon-S3-LOCATION-Pfad für die Eingabedaten. Wenn der eingegebene LOCATION-Pfad falsch ist, gibt Athena keine Datensätze zurück.

Doppelter Schrägstrich im LOCATION-Pfad

Athena unterstützt keine Tabellen-Location-Pfade, die einen doppelten Schrägstrich (//) enthalten. Der folgende LOCATION-Pfad gibt beispielsweise leere Ergebnisse zurück: s3://doc-example-bucket/myprefix//input//

Um dieses Problem zu beheben, kopieren Sie die Dateien an eine Location ohne doppelte Schrägstriche. Im Folgenden finden Sie einen AWS Command Line Interface (AWS CLI)-Befehl zum Kopieren von Dateien:

aws s3 cp s3://doc-example-bucket/myprefix//input// s3://doc-example-bucket/myprefix/input/ --recursive

Hinweis: Wenn Sie beim Ausführen von AWS-CLI-Befehlen Fehler erhalten, stellen Sie sicher, dass Sie die neueste AWS-CLI-Version verwenden.

Sonderzeichen

Es hat sich bewährt, nur Unterstriche oder Großbuchstaben in die Spaltennamen Ihrer Tabelle aufzunehmen. Sie können beispielsweise einer Spalte den Namen Tabellen_Name geben, aber nicht den Namen Tabellenname. Daten für mehrere Tabellen, die im selben S3-Präfix AWS Glue Crawler gespeichert sind, erstellen separate Tabellen für Daten, die im selben S3-Präfix gespeichert sind. Wenn Sie diese Tabellen jedoch in Athena abfragen, erhalten Sie keine Datensätze. Ihre Athena-Abfrage gibt beispielsweise keine Datensätze zurück, wenn Ihr Tabellen-Speicherort den folgenden Beispielen ähnelt:

  • s3://doc-example-bucket/table1.csv
  • s3://doc-example-bucket/table2.csv

Um dieses Problem zu beheben, erstellen Sie für jede Tabelle individuelle S3-Präfixe, die den folgenden Beispielen ähneln:

  • s3://doc-example-bucket/table1/table1.csv
  • s3://doc-example-bucket/table2/table2.csv

Führen Sie anschließend eine Abfrage ähnlich dem folgenden Beispiel aus, um den Speicherort für Ihre Tabelle table1 zu aktualisieren:

ALTER TABLE table1 SET LOCATION 's3://doc-example-bucket/table1';

Partitionen noch nicht geladen

Athena erstellt Metadaten nur, wenn eine Tabelle erstellt wird. Die Daten werden nur analysiert, wenn Sie die Abfrage ausführen. Wenn Ihre Tabelle über definierte Partitionen verfügt, wurden die Partitionen möglicherweise noch nicht in den AWS-Glue-Datenkatalog oder den internen Athena-Datenkatalog geladen. Verwenden Sie MSCK REPARATURTISCH oder ALTER TABLE PARTITION HINZUFÜGEN, um die Partitionsinformationen in den Katalog zu laden.

Wenn die Partitionen in einem Format gespeichert sind, das Athena unterstützt, führen Sie MSCK REPARATURTISCH aus, um die Metadaten einer Partition in den Katalog zu laden. Wenn Sie beispielsweise eine Tabelle haben, die nach Jahr partitioniert ist, erwartet Athena, die Daten unter Amazon S3-Pfaden zu finden, die den folgenden Beispielen ähneln:

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

Wenn sich die Daten unter den von Athena erwarteten Amazon S3-Pfaden befinden, führen Sie einen Befehl ähnlich diesem Beispiel aus, um die Tabelle zu reparieren:

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

Nachdem die Tabelle erstellt wurde, laden Sie die Partitionsinformationen:

MSCK REPAIR TABLE Employee;

Nachdem die Daten geladen wurden, führen Sie die folgende Abfrage erneut aus:

SELECT * FROM Employee;

Wenn die Partitionen nicht in einem von Athena unterstützten Format gespeichert sind oder sich unter verschiedenen Amazon S3-Pfaden befinden, führen Sie ALTER TABLE ADD PARTITION für die einzelnen Partitionen aus.

Nehmen wir zum Beispiel an, dass sich Ihre Daten unter den folgenden Amazon S3-Pfaden befinden:

  • s3://doc-example-bucket/athena/inputdata/2020/data.csv
  • s3://doc-example-bucket/athena/inputdata/2019/data.csv
  • s3://doc-example-bucket/athena/inputdata/2018/data.csv

Führen Sie mit diesen Pfaden einen Befehl aus, der diesem Beispiel ähnelt:

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

Nachdem die Daten geladen wurden, führen Sie die folgende Abfrage erneut aus:

SELECT * FROM Employee;

In Hive versteckte Dateien

Stellen Sie sicher, dass Ihre Dateinamen nicht mit einem Unterstrich (_) oder einem Punkt (.) beginnen.

Athena betrachtet diese Dateien als Platzhalter und ignoriert sie, wenn Sie eine Abfrage verarbeiten. Weitere Informationen finden Sie unter Athena kann versteckte Dateien nicht lesen. Wenn alle Dateien in Ihrem S3-Pfad Namen haben, die mit einem Unterstrich oder einem Punkt beginnen, erhalten Sie keine Datensätze.

Hinweis: Wenn Ihr S3-Pfad Platzhalter sowie Dateien enthält, deren Namen mit unterschiedlichen Zeichen beginnen, ignoriert Athena nur die Platzhalter und fragt die anderen Dateien ab. Daher erhalten Sie möglicherweise einen oder mehrere Datensätze.

Zum Beispiel:

  • s3://doc-example-bucket/athena/inputdata/_file1
  • s3://doc-example-bucket/athena/inputdata/.file2

Partitionsprojektion

Werte, die nicht innerhalb der Bereichsgrenzen für die Partitionsprojektion liegen

Abfragen nach Werten, die außerhalb der für die Partitionsprojektion definierten Bereichsgrenzen liegen, geben keinen Fehler zurück. Stattdessen gibt die Abfrage null Zeilen zurück.

Nehmen wir zum Beispiel an, Ihre Daten beginnen im Jahr 2020 und sind wie folgt definiert: projection.timestamp.range'='2020/01/01,JETZT

Wenn Sie diese Beispielabfrage ausführen, wird die Abfrage erfolgreich abgeschlossen, es werden jedoch keine Zeilen zurückgegeben:

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

Die Speichervorlage folgt nicht dem Standardpartitionierungsschema

Wenn Ihre Amazon S3-Datei-Locations nicht dem Location-Muster „... /column =Wert...“ folgen, dann müssen Sie ein benutzerdefiniertes Amazon S3-Partitionierungsschema angeben. Wenn Sie kein benutzerdefiniertes Schema definieren, gibt Ihre Abfrage null Datensätze zurück.

Informationen zum Definieren eines benutzerdefinierten S3-Partitionierungsschemas finden Sie unter Benutzerdefinierte S3-Speicherorten angeben.

Falsche benutzerdefinierte Speichervorlage

Wenn Sie eine benutzerdefinierte Vorlage verwenden, stellen Sie sicher, dass die Vorlage es Athena ermöglicht, Ihre Partitions-Locations zu erstellen. Stellen Sie außerdem sicher, dass jeder Platzhalter und der Amazon S3-Pfad mit einem einzigen Schrägstrich enden.

Nehmen wir beispielsweise an, Sie definieren eine Partitionsspalte Jahr mit der DDL-Anweisung PARTITIONIERT DURCH (Jahreszeichenfolge) und Ihre S3-Dateiposition lautet s3://doc-example-bucket/athena/inputdata/Year=2022/. Dieser Standort gibt Null Datensätze zurück. Aktualisieren Sie den Amazon S3-Speicherort auf: s3://doc-example-bucket/athena/inputdata/Year=${year}.

Partitionseigenschaften

Wenn Sie einen Partitionsspalten-Enum-, Integer- oder Datumstyp haben, stellen Sie sicher, dass Sie die Partitionseigenschaften richtig einstellen. Die Konfigurationen müssen es Athena ermöglichen, Partitions-Locations zu erstellen, die der Struktur Ihrer Daten auf Amazon S3 entsprechen.

Nehmen wir zum Beispiel an, Sie haben zeitbezogene Daten, die täglich eine Stunde nach Mitternacht an folgender Adresse eingehen: s3://doc-example-bucket/athena/inputdata/2022-01-01-01-00.

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 null Datensätze zurück. Dies liegt daran, dass die projizierten Datei-Locations der Eigenschaft Mitternacht entsprechen s3://doc-example-bucket/athena/inputdata/2022-01-01-00-00.

Um dieses Problem zu beheben, setzen Sie die Eigenschaft 'projection.dt.range' auf '2022-01-01-01-00, JETZT'.

Ähnliche Informationen

Erstellen Tabellen in Athena

Verwendung von AWS Glue-Crawlers

Richten Partitionsprojektion ein

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 8 Monaten