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.
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 esNULL
. Una posible solución alternativa es usarDropNullFields.apply
para eliminar los camposNULL
antes de escribir en la base de datos. Sin embargo, si prefieres evitar esto, podrías intentar convertir explícitamente los valoresNULL
en la columna al tipoENUM
.Aquí tienes un ejemplo de cómo podrías hacerlo:
Esto asegurará que los valores
NULL
en la columnax
sean convertidos explícitamente al tipoENUM
antes de ser escritos en la base de datos.