Direkt zum Inhalt

Wie behebe ich den Fehler „Schema kann nicht abgeleitet werden“ in AWS Glue?

Lesedauer: 3 Minute
0

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

Verwaltung von Partitionen für die ETL-Ausgabe in AWS Glue

AWS OFFICIALAktualisiert vor 9 Monaten