Salta al contenuto

Come posso risolvere l'errore "Unable to infer schema" in AWS Glue?

4 minuti di lettura
0

Quando eseguo il mio processo AWS Glue per elaborare file Parquet o ORC archiviati in Amazon Simple Storage Service (Amazon S3), ricevo un errore "Unable to infer schema".

Breve descrizione

I file Parquet o ORC devono seguire un formato di percorso di partizione chiave=valore in stile Hive. Se i file utilizzano invece una struttura di percorsi gerarchica, AWS Glue non comprende lo schema e restituisce un esito negativo.

Ad esempio, se il processo AWS Glue elabora file da s3://s3-bucket/parquet-data/, i file devono utilizzare il seguente formato partizionato:

s3://s3-bucket/parquet-data/year=2018/month=10/day=10/file1.parquet

Se i file utilizzano il seguente formato non partizionato, il processo AWS Glue ha esito negativo:

s3://s3-bucket/parquet-data/year/month/day/file1.parquet

Risoluzione

Per risolvere l'errore "Unable to infer schema" in AWS Glue, utilizza uno dei seguenti metodi a seconda del caso d'uso.

Ristruttura i dati

Copia i file in un nuovo bucket S3 e utilizza percorsi partizionati in stile Hive. Quindi esegui il processo.

Sostituisci i nomi delle colonne della partizione con asterischi

Se non puoi ristrutturare i dati, crea il DynamicFrame direttamente da Amazon S3. Utilizza asterischi (\ *) al posto dei nomi delle colonne della partizione. AWS Glue include solo i dati nel DynamicFrame, non le colonne della partizione.

Ad esempio, se archivi i file in un bucket S3 con percorso del file s3://s3-bucket/parquet-data/year/month/day/files.parquet, utilizza il seguente DynamicFrame:

dynamic_frame0 = glueContext.create_dynamic_frame_from_options(
    's3',
    connection_options={'paths': ['s3://s3-bucket/parquet-data/*/*/*']},
    format='parquet',
    transformation_ctx='dynamic_frame0'
)

Utilizza una trasformazione della classe della mappa per aggiungere le colonne della partizione

Per includere le colonne della partizione nel DynamicFrame, leggi i dati nel DataFrame e aggiungi una colonna per il percorso del file Amazon S3. Quindi applica una trasformazione della classe della mappa.

Esempio di codice:

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"
)

Nota: sostituisci gli esempi di percorso S3 con i tuoi percorsi S3 e personalizza le colonne della partizione in base al tuo caso d'uso.

Risolvi file o prefissi inesistenti

Se nel percorso non è presente alcun file, verifica se i file sono stati eliminati o archiviati. Se i file utilizzano un prefisso diverso, aggiorna il parametro connection_options nello script di AWS Glue in modo che punti verso il percorso corretto. Inoltre, controlla se la tabella del catalogo fa riferimento a una posizione S3 mancante o obsoleta. Se la tabella punta verso file mancanti, il processo ha esito negativo perché non sono presenti dati da elaborare.

Risolvi gli errori generati da un processo con parametro segnalibro nella scansione di file con timestamp precedente

Quando utilizzi un segnalibro del processo, AWS Glue tiene traccia dei file elaborati in precedenza e salta quelli con timestamp precedente. Se il processo non trova nuovi file idonei, l’esito è negativo perché non sono presenti dati da elaborare.

Per risolvere l’errore, intraprendi le seguenti azioni:

  • Verifica che i timestamp modificati dei file rientrino nell'intervallo previsto.
  • Disattiva i segnalibri per rielaborare tutti i file.
  • Rinomina o aggiorna i file in modo che la modifica comporti un aggiornamento del timestamp e AWS Glue, rilevandoli come nuovi, li includa nell'esecuzione successiva.

Informazioni correlate

Gestione delle partizioni per l'output ETL in AWS Glue

AWS UFFICIALEAggiornata un anno fa