1
resposta

Ao rodar o código dá um erro

Error Category: QUERY_ERROR; Spark Error Class: MISSING_COLUMN; AnalysisException: Column 'Comentario' does not exist. Did you mean one of the following? [];

entrei no arquivo parquet, mas não consigo ajustar. Poderia me auxiliar?

1 resposta

Oii, Jonathas! Tudo bem?

O erro é sobre a coluna Comentário não ter sido encontrada e pode estar linkada a vários motivos. Sendo assim, peço que verifique o nome da coluna e o seu código como um todo, revisando se há erros de digitação, espaços extras, etc.

Aqui está o código completo para revisão:

# Importando as bibliotecas necessárias para utilizar o ETL Jobs do Glue com Pyspark 
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

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

# Iniciando a sessão
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

# Gerando um DynamicFrame a partir de uma tabela no Data Catalog
redes_sociais_zoop_dyf = glueContext.create_dynamic_frame.from_catalog(database='db-glue-zoop', table_name='zoop-glue-redes_sociais_zoop_bronze_parquet')

# Convertendo o DynamicFrame em um DataFrame Spark
redes_sociais_zoop_df = redes_sociais_zoop_dyf.toDF()

### Tratando os textos da coluna Comentario e geração da coluna Avaliacao

# Importando a função sql do Pyspark regexp_replace para troca de expressões e regexp_extract para extração de textos
from pyspark.sql.functions import regexp_extract, regexp_replace

# Extrair a nota da avaliação e salvar na coluna 'Avaliacao'
redes_sociais_zoop_df = redes_sociais_zoop_df.withColumn("Avaliacao", regexp_extract("Comentario", r"Nota (\d)", 1))

# Remover o texto "Nota valor" do comentário original
redes_sociais_zoop_df = redes_sociais_zoop_df.withColumn("Comentario", regexp_replace("Comentario", r" Nota \d", ""))

### Convertendo o DataFrame Spark em DynamicFrame e mapeando os tipos dos dados

# Importando a função que gera um DynamicFrame
from awsglue.dynamicframe import DynamicFrame

# Converter o DataFrame Spark em DynamicFrame
redes_sociais_zoop_dyf = DynamicFrame.fromDF(redes_sociais_zoop_df, glueContext, "glue_etl")

# Mapeando as colunas do DynamicFrame
redes_sociais_zoop_dyf_mapeado = redes_sociais_zoop_dyf.apply_mapping(
    mappings=[
        ("ID_social", "long", "id_estoque", "long"),
        ("Data", "string", "data", "date"),
        ("Influencia_autor", "long", "influencia_autor", "int"),
        ("Plataforma", "string", "plataforma", "string"),
        ("Nome_produto", "string", "produto", "string"),
        ("Categoria_produto", "string", "categoria_produto", "string"),
        ("Avaliacao", "string", "avaliacao", "int"),
        ("Comentario", "string", "comentario", "string")        
    ]
)

# Configurando o glueContext sink para escrever nova tabela
s3output = glueContext.getSink(
  path="s3://nome-do-bucket/silver/redes-sociais/",   # adicione o nome do seu bucket no path
  connection_type="s3",
  updateBehavior="UPDATE_IN_DATABASE",
  partitionKeys=[],
  compression="snappy",
  enableUpdateCatalog=True,
  transformation_ctx="s3output",
)

# Escrevendo a tabela no Glue Data Catalog
s3output.setCatalogInfo(
  catalogDatabase="db-glue-zoop", catalogTableName="zoop-glue-redes_sociais_zoop_silver"
)
s3output.setFormat("glueparquet")
s3output.writeFrame(redes_sociais_zoop_dyf_mapeado)

job.commit()

Espero que dê certo, conte sempre conosco para te auxiliar.

Bons estudos e até mais!