es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema con Enum de PostreSQL al escribir un DynamicFrame de AWS Glue con escritura JDBC.

Estoy tratando de escribir un AWSGlue DynamicFrame en una base de datos PostgreSQL con una escritura JDBC. La tabla de destino incluye una columna de tipo Enum.

Comienzo seleccionando las columnas de interés del DataFrame subyacente de PySpark y luego convierto el DataFrame en un DynamicFrame:


<h1>Seleccionar columnas de interés</h1> <p>final<em>df = df.select("id", "my</em>struct.*")</p> <h1>Convertir de nuevo a DynamicFrame</h1> <p>dyf = DynamicFrame.fromDF(final<em>df, context, "final</em>dyf")

La inserción se realiza utilizando el siguiente código:

glue_context.write_dynamic_frame.from_options(
frame=dyf,
connection_type="postgresql",
connection_options={
"url": "jdbc:postgresql://my_db_url",
"user": POSTGRES_USER,
"password": POSTGRES_PASSWORD,
"dbtable": table_name,
"stringtype": "unspecified",
},
transformation_ctx=f"write_dyf_to_{table_name}_table",
)

Al insertar mis datos, recibí el siguiente mensaje de error:

ERROR: La columna "x" es de tipo x_enum pero la expresión es de tipo character.
Sugerencia: Deberá reescribir o convertir la expresión.

Consulté esta publicación: https://stackoverflow.com/questions/68263214/problem-writting-an-enun-on-postgresql-using-a-pyspark-dataframe-with-jdbc-write que señala el mismo problema. La respuesta sugerida recomienda agregar "stringtype": "unspecified" en las opciones de conexión JDBC.

Lo hice, pero aún tengo el problema. Sospecho que el problema se debe al hecho de que en este caso particular toda la columna x es NULL. La columna enum en la tabla PostgreSQL es NULLABLE.

Encontré una solución alternativa utilizando DropNullFields.apply, pero me gustaría evitar hacer esto si es posible.

¿Alguien ha enfrentado este problema anteriormente o tiene alguna sugerencia?

Agradezco mucho la ayuda.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que estás enfrentando está relacionado con el hecho de que la columna enum en la tabla de PostgreSQL es nullable y la columna x en tus datos es NULL. Una posible solución alternativa es usar DropNullFields.apply para eliminar los campos NULL antes de escribir en la base de datos. Sin embargo, si prefieres evitar esto, podrías intentar convertir explícitamente los valores NULL en la columna al tipo ENUM.

    Aquí tienes un ejemplo de cómo podrías hacerlo:

    import pyspark.sql.functions as F
    
    # Selecciona las columnas de interés
    final_df = df.select("id", "my_struct.*")
    
    # Convierte explícitamente los valores NULL en la columna enum al tipo ENUM
    final_df = final_df.withColumn("x", F.expr("CAST(x AS x_enum)"))
    
    # Convierte nuevamente a DynamicFrame
    dyf = DynamicFrame.fromDF(final_df, context, "final_dyf")
    
    # Escribe en la base de datos de PostgreSQL
    glue_context.write_dynamic_frame.from_options(
        frame=dyf,
        connection_type="postgresql",
        connection_options={
            "url": "jdbc:postgresql://my_db_url",
            "user": POSTGRES_USER,
            "password": POSTGRES_PASSWORD,
            "dbtable": table_name,
            "stringtype": "unspecified",
        },
        transformation_ctx=f"write_dyf_to_{table_name}_table",
    )
    

    Esto asegurará que los valores NULL en la columna x sean convertidos explícitamente al tipo ENUM antes de ser escritos en la base de datos.

Comments are closed.