Recebo um erro “Unable to infer schema” quando executo meu trabalho do AWS Glue para processar arquivos Parquet ou ORC que eu armazeno no Amazon Simple Storage Service (Amazon S3).
Breve descrição
Os arquivos Parquet ou ORC devem seguir um formato de caminho de partição chave=valor no estilo Hive. Se, em vez disso, os arquivos usarem uma estrutura de caminho hierárquica, o AWS Glue não entenderá o esquema e falhará.
Por exemplo, se seu trabalho do AWS Glue processa arquivos de s3://s3-bucket/parquet-data/, os arquivos devem usar o seguinte formato particionado:
s3://s3-bucket/parquet-data/year=2018/month=10/day=10/file1.parquet
Se os arquivos usarem o seguinte formato não particionado, o trabalho do AWS Glue falhará:
s3://s3-bucket/parquet-data/year/month/day/file1.parquet
Resolução
Para resolver o erro “Unable to infer schema” no AWS Glue, use um dos métodos a seguir para seu caso de uso.
Reestruture seus dados
Copie os arquivos em um novo bucket do S3 e use caminhos particionados no estilo Hive. Em seguida, execute o trabalho.
Substitua os nomes das colunas da partição por asteriscos
Se você não conseguir reestruturar seus dados, crie o DynamicFrame diretamente do Amazon S3. Use asteriscos (*) no lugar dos nomes das colunas da partição. O AWS Glue inclui somente os dados no DynamicFrame, não as colunas da partição.
Por exemplo, se você armazenar seus arquivos em um bucket do S3 com o caminho do arquivo s3://s3-bucket/parquet-data/year/month/day/files.parquet, use o DynamicFrame:
dynamic_frame0 = glueContext.create_dynamic_frame_from_options(
's3',
connection_options={'paths': ['s3://s3-bucket/parquet-data/*/*/*']},
format='parquet',
transformation_ctx='dynamic_frame0'
)
Use uma transformação de classe de mapa para adicionar colunas de partição
Para incluir as colunas de partição no DynamicFrame, leia os dados no DataFrame e adicione uma coluna para o caminho do arquivo Amazon S3. Em seguida, aplique uma transformação de classe de mapa.
Exemplo de código:
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"
)
Observação: substitua os exemplos de caminhos do S3 pelos caminhos do S3 e personalize as colunas de partição para seu caso de uso.
Resolver arquivos ou prefixos que não existem
Se nenhum arquivo estiver no caminho, verifique se você excluiu ou arquivou os arquivos. Se os arquivos usarem um prefixo diferente, atualize o parâmetro connection_options em seu script do AWS Glue para apontar o caminho correto. Além disso, verifique se a tabela do catálogo faz referência a um local do S3 ausente ou desatualizado. Se a tabela apontar arquivos ausentes, o trabalho falhará porque não há dados para processar.
Resolver problemas quando um trabalho com o parâmetro marcador de trabalho digitaliza arquivos antigos
Quando você usa um marcador de trabalho, o AWS Glue rastreia arquivos processados anteriormente e ignora arquivos com carimbos de data/hora mais antigos. Se o trabalho não encontrar novos arquivos qualificados, o trabalho falhará porque não há dados para processar.
Para resolver esse problema, execute as seguintes ações:
- Confirme se os carimbos de data/hora modificados dos arquivos estão dentro do intervalo esperado.
- Desative os favoritos para reprocessar todos os arquivos.
- Renomeie ou atualize os arquivos para que tenham os carimbos de data e hora mais recentes da última modificação, para que o AWS Glue os detecte como novos arquivos e os inclua na próxima execução.
Informações relacionadas
Gerenciamento de partições para saída de ETL no AWS Glue