我正在尝试使用 JDBC 写入在 PostgreSQL 数据库中编写 AWSGlue DynamicFrame。目标表包括一列
Enum
.
我首先从底层 PySpark DataFrame 中选择感兴趣的列,然后将 DataFrame 转换为 DynamicFrame:
# Select columns of interest
final_df = df.select("id", "my_struct.*")
# Convert back to DynamicFrame
dyf = DynamicFrame.fromDF(final_df, context, "final_dyf")
插入使用以下代码完成:
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",
)
插入我的数据时,我收到以下错误消息:
ERROR: column "x" is of type x_enum but expression is of type character.
Hint: You will need to rewrite or cast the expression.
我看过这篇文章:使用 PySpark Dataframe 和 jdbc write 在 PostgreSQL 上写一个 enun 的问题突出了同样的问题。建议的答案建议在JDBC连接选项中添加
"stringtype": "unspecified"
我做到了,但我仍然遇到问题。我怀疑问题来自于这样一个事实,即在这种特殊情况下,整个专栏
x
是NULL
。 PostgreSQL 表中的枚举列是NULLABLE
.
我找到了使用
DropNullFields.apply
的解决方法,但我想尽可能避免这样做。
有没有人以前遇到过这个问题或有什么建议?
非常感谢帮助。
你面临的问题是 Postgres 的类型非常严格。这意味着变量必须是声明的数据类型。 (是的,Postgres 会尝试一些隐式转换,但依赖它们通常是一个糟糕的计划。)转换为正确的数据类型通常要安全得多。尽管 NULL 实际上对任何数据类型都有效,但它不会自动成为所需的类型。我不知道您的特殊方言,因此将直接为转换提供 SQL。有两种方法:(见demo)
你应该能够合并其中之一。
这个问题有没有解决?表中有枚举,但动态框架将其作为字符串而不是枚举类型值处理?