开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

发现flink cdc postgres部分字段没有按照字段名去生成insert into,而是数据

发现flink cdc postgres部分字段没有按照字段名去生成insert into,而是用数据的index去匹配的。这个大家有碰到过吗? 类似于insert into xxx(code,en_name, cn_name) values (...); 如果写成 select($("code"), ${"cn_name"}, $("en_name")) 插入的数据就会反了。

如果按照相应的顺序书写成 select($("code"), $("en_name"), ${"cn_name"}) 数据就正确插入了。

展开
收起
爱喝咖啡嘿 2022-12-20 15:38:29 245 0
1 条回答
写回答
取消 提交回答
  • 是的,我遇到过类似的问题,即 Flink CDC PostgreSQL 连接器在将数据从 PostgreSQL 表插入到下游表时,字段顺序与源表中的字段顺序不匹配。

    原因

    Flink CDC PostgreSQL 连接器使用 Debezium PostgreSQL 连接器,它在捕获更改数据时使用“无模式”模式。在这种模式下,Debezium 仅捕获有关更改数据的元数据和值,而不会捕获有关字段名称或顺序的信息。

    当 Flink CDC PostgreSQL 连接器将捕获的更改数据写入下游表时,它会根据下游表的架构推断字段顺序。如果下游表的架构与源表的架构不完全匹配,则可能会导致字段顺序不匹配。

    解决方法

    要解决此问题,您可以使用以下方法之一:

    修改下游表的架构:确保下游表的架构与源表的架构完全匹配,包括字段顺序。
    使用显式字段映射:在 Flink SQL 查询中使用显式字段映射来指定字段的顺序。例如:
    INSERT INTO sink_table (code, en_name, cn_name)
    SELECT $("code"), $("en_name"), $("cn_name")
    FROM source_table;
    示例

    以下示例演示了如何使用显式字段映射来解决字段顺序不匹配问题:

    源表架构:

    CREATE TABLE source_table (
    code VARCHAR(255) NOT NULL,
    en_name VARCHAR(255) NOT NULL,
    cn_name VARCHAR(255) NOT NULL
    );
    下游表架构:

    CREATE TABLE sink_table (
    en_name VARCHAR(255) NOT NULL,
    cn_name VARCHAR(255) NOT NULL,
    code VARCHAR(255) NOT NULL
    );
    Flink SQL 查询:

    -- 使用显式字段映射来指定字段顺序
    INSERT INTO sink_table (code, en_name, cn_name)
    SELECT $("code"), $("en_name"), $("cn_name")
    FROM source_table;
    使用显式字段映射后,Flink CDC PostgreSQL 连接器将按照指定的顺序将数据插入到下游表中,即使下游表的架构与源表的架构不完全匹配。

    2024-02-26 17:07:40
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关产品

  • 实时计算 Flink版
  • 相关电子书

    更多
    Flink CDC Meetup PPT - 龚中强 立即下载
    Flink CDC Meetup PPT - 王赫 立即下载
    Flink CDC Meetup PPT - 覃立辉 立即下载