使用 JDBC 写入 AWS Glue DynamicFrame 时,PostreSQL 枚举出现问题

问题描述 投票:0回答:2

我正在尝试使用 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
的解决方法,但我想尽可能避免这样做。

有没有人以前遇到过这个问题或有什么建议?

非常感谢帮助。

postgresql jdbc pyspark aws-glue
2个回答
0
投票

你面临的问题是 Postgres 的类型非常严格。这意味着变量必须是声明的数据类型。 (是的,Postgres 会尝试一些隐式转换,但依赖它们通常是一个糟糕的计划。)转换为正确的数据类型通常要安全得多。尽管 NULL 实际上对任何数据类型都有效,但它不会自动成为所需的类型。我不知道您的特殊方言,因此将直接为转换提供 SQL。有两种方法:(见demo

  1. Postgres cast 运算符。从::到
  2. SQL sandard cast dunction。演员(从到)

你应该能够合并其中之一。


-3
投票

这个问题有没有解决?表中有枚举,但动态框架将其作为字符串而不是枚举类型值处理?

© www.soinside.com 2019 - 2024. All rights reserved.