Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
Come posso risolvere l'errore "Unable to infer schema" in AWS Glue?
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

Contenuto pertinente
AWS UFFICIALEAggiornata 4 anni fa