Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
Wie behebe ich den Fehler „Schema kann nicht abgeleitet werden“ in AWS Glue?
Ich erhalte die Fehlermeldung „Schema kann nicht abgeleitet werden“, wenn ich meinen AWS Glue-Job ausführe, um Parquet- oder ORC-Dateien zu verarbeiten, die ich in Amazon Simple Storage Service (Amazon S3) speichere.
Kurzbeschreibung
Parquet- oder ORC-Dateien müssen einem key=value-Partitionspfadformat im Hive-Stil folgen. Wenn die Dateien stattdessen eine hierarchische Pfadstruktur verwenden, versteht AWS Glue das Schema nicht und schlägt fehl.
Wenn der AWS Glue-Job beispielsweise Dateien von s3://s3-bucket/parquet-data/ verarbeitet, müssen die Dateien das folgende partitionierte Format verwenden:
s3://s3-bucket/parquet-data/year=2018/month=10/day=10/file1.parquet
Wenn die Dateien das folgende nicht partitionierte Format verwenden, schlägt der AWS Glue-Job fehl:
s3://s3-bucket/parquet-data/year/month/day/file1.parquet
Lösung
Verwende eine der folgenden Methoden für den Anwendungsfall, um den Fehler „Schema kann nicht abgeleitet werden“ in AWS Glue zu beheben.
Daten umstrukturieren
Kopiere die Dateien in einen neuen S3-Bucket und verwende partitionierte Pfade im Hive-Stil. Führe dann den Job aus.
Ersetze die Namen der Partitionsspalten durch Sternchen
Wenn du die Daten nicht umstrukturieren kannst, erstelle den DynamicFrame direkt aus Amazon S3. Verwende Sternchen (*) anstelle von Partitionsspaltennamen. AWS Glue enthält nur die Daten in DynamicFrame, nicht die Partitionsspalten.
Wenn du beispielsweise die Dateien in einem S3-Bucket mit dem Dateipfad s3://s3-bucket/parquet-data/year/month/day/files.parquet speicherst, verwende den folgenden DynamicFrame:
dynamic_frame0 = glueContext.create_dynamic_frame_from_options( 's3', connection_options={'paths': ['s3://s3-bucket/parquet-data/*/*/*']}, format='parquet', transformation_ctx='dynamic_frame0' )
Eine Transformation der Zuordnungsklassen verwenden, um Partitionsspalten hinzuzufügen
Um die Partitionsspalten in den DynamicFrame aufzunehmen, lies die Daten in den DataFrame ein und füge eine Spalte für den Amazon S3-Dateipfad hinzu. Wende dann eine Transformation der Zuordnungsklassen an.
Beispielcode:
import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job from awsglue.dynamicframe import DynamicFrame from pyspark.sql.functions import input_file_name args = getResolvedOptions(sys.argv, ['JOB_NAME']) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME'], args) df = spark.read.parquet("s3://s3-bucket/parquet-data/*/*/*") modified_df = df.withColumn('partitions_column', input_file_name()) dyf_0 = DynamicFrame.fromDF(modified_df, glueContext, "dyf_0") def modify_col(x): if x['partitions_column']: new_columns = x['partitions_column'].split('/') x['year'], x['month'], x['day'] = new_columns[4], new_columns[5], new_columns[6] del x['partitions_column'] return x modified_dyf = Map.apply(dyf_0, f=modify_col) datasink2 = glueContext.write_dynamic_frame.from_options( frame=modified_dyf, connection_type="s3", connection_options={ "path": "s3://my-output-bucket/output/", "partitionKeys": ["year", "month", "day"] }, format="parquet", transformation_ctx="datasink2" )
Hinweis: Ersetze die Beispiel-S3-Pfade durch deine S3-Pfade und passe die Partitionsspalten für den Anwendungsfall an.
Dateien oder Präfixe auflösen, die nicht existieren
Wenn sich keine Dateien im Pfad befinden, überprüfe, ob du die Dateien gelöscht oder archiviert hast. Wenn die Dateien ein anderes Präfix verwenden, aktualisiere den Parameter connection_options im AWS Glue-Skript so, dass er auf den richtigen Pfad verweist. Prüfe außerdem, ob die Katalogtabelle auf einen fehlenden oder veralteten S3-Speicherort verweist. Wenn die Tabelle auf fehlende Dateien verweist, schlägt der Job fehl, weil keine zu verarbeitenden Daten vorhanden sind.
Probleme lösen, wenn ein Job mit dem Parameter „Job-Lesezeichen“alte Dateien scannt
Wenn du ein Job-Lesezeichen verwendest, verfolgt AWS Glue zuvor verarbeitete Dateien und überspringt Dateien mit älteren Zeitstempeln. Wenn der Job keine neuen geeigneten Dateien findet, schlägt der Job fehl, weil keine zu verarbeitenden Daten vorhanden sind.
Gehe wie folgt vor, um dieses Problem zu beheben:
- Vergewissere dich, dass die geänderten Zeitstempel der Dateien im erwarteten Bereich liegen.
- Deaktiviere die Lesezeichen, um alle Dateien erneut zu verarbeiten.
- Benenne die Dateien um oder aktualisiere sie mit neueren Zeitstempeln der letzten Änderung, sodass AWS Glue sie als neue Dateien erkennt und sie in die nächste Ausführung einbezieht.
Ähnliche Informationen

Relevanter Inhalt
AWS OFFICIALAktualisiert vor 4 Jahren
AWS OFFICIALAktualisiert vor 5 Jahren
AWS OFFICIALAktualisiert vor einem Jahr