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

请问flink mysql cdc 双流left join后再入库在目标表c没有删除呢?

"请问flink mysql cdc 双流left join后再入库mysql,insert into c select from a left join b,源表a某些数据删了,在目标表c没有删除呢?三个表都设置了主键。请问怎么解决?测试删除trans_detail的数据,在结果表里没有被删除,没有left join的话,能同步删除。
4aa9d8356ee2e19b9b61cbd073ef22ff.png
INSERT INTO tr_flow_base_info_v2
SELECT
FID AS id,
'COM-201708250091510104MA6DGK9F1W' AS com_no,
FID AS transaction_no,
a.FCONTRACTCODE as contract_no,
BUSTYPE as transaction_type_no,
TRANSWAY as transaction_method_no,
TRANSAMOUNT as transaction_total_amount,
if(BUSACCOUNTTYPE='BAY','20050002','20050001') AS is_account,
if(BUSACCOUNTTYPE='BAY' and AUDITSTATUS='Y','20030002','20030001') AS transaction_state,
'30070003' as belong_user_type,
VOUCHERDATE AS inst_time,
CURRENT_TIMESTAMP updt_time
FROM trans_detail t
LEFT JOIN t_account a on t.ACCOUNTNO = a.ACCOUNTNO;"

展开
收起
小易01 2023-07-26 08:39:25 140 0
3 条回答
写回答
取消 提交回答
  • 如果在 Flink CDC 中进行左连接操作后将结果写入目标表 C,而目标表 C 中旧的数据没有被删除,可能是由于以下几个原因:

    1. 数据库写入模式设置不正确:在写入目标表 C 时,请确保使用正确的数据库写入模式。常见的写入模式有追加模式(Append Mode)、更新模式(Update Mode)和撤回模式(Retract Mode)。根据你的需求选择合适的写入模式,以确保旧数据被正确处理。

    2. 未正确配置主键或唯一约束:当使用 CDC 进行左连接操作并写入目标表 C 时,确保目标表 C 的主键或唯一约束已正确配置。如果没有正确配置主键或唯一约束,写入操作可能会导致重复数据或无法正常删除旧数据。

    3. 未正确配置事务:如果在写入目标表 C 时使用了事务,并且事务提交失败或未正确配置,可能会导致旧数据没有被删除。请确保事务的正确使用和配置,以保证数据的一致性和完整性。

    4. 业务逻辑错误:最后,确保你的 Flink 程序中的业务逻辑正确处理了左连接操作和数据写入操作。检查代码中是否存在逻辑错误或遗漏,可能导致旧数据未被删除。

    总之,在排查问题时,请仔细检查和调试你的 Flink CDC 程序,确保正确配置写入模式、主键或唯一约束、事务等,并确保业务逻辑正确处理左连接操作和数据写入操作。

    如果问题仍然存在,请提供更多关于你的 Flink CDC 程序、目标表结构以及具体的代码示例,以便我能够更好地理解问题并给出更具体的解决方案。

    2023-07-31 22:25:05
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    如果您在 Flink CDC 中进行了 MySQL 双流 left join 操作后,将结果写入到目标表 C 中,但是目标表 C 中没有被删除,这可能是由于数据写入的模式不正确导致的。
    在 Flink CDC 中,数据写入的模式分为两种:append 和 retract。append 模式表示将新的数据追加到目标表中,如果目标表中已经存在相同的主键,则会出现主键冲突;retract 模式则表示将新的数据和旧的数据进行比较,如果存在冲突,则将旧的数据删除,并将新的数据插入到目标表中。
    如果您的数据写入模式是 append,而不是 retract,那么即使进行 left join 操作,目标表 C 中原有的数据也不会被删除。您可以尝试将数据写入模式改为 retract,重新运行程序,看是否能够解决这个问题。
    另外,如果您在 left join 操作中使用了时间属性,例如 event time 或者 processing time,那么可能需要调整 watermark 或者 allowed latene

    2023-07-29 13:46:19
    赞同 展开评论 打赏
  • 存在即是合理

    这个问题可能是由于MySQL的binlog格式不兼容导致的。在MySQL 5.6及以上版本中,可以使用ROW模式来记录数据变更,而在MySQL
    5.1及以下版本中,只能使用STATEMENT模式来记录数据变更。如果源表a的数据被删除了,但是在目标表c中没有被删除,那么可能是因为源表a使用了STATEMENT模式来记录数据变更,而目标表c使用了ROW模式来记录数据变更。

    为了解决这个问题,可以尝试将源表a和目标表c都设置为使用ROW模式来记录数据变更。具体操作如下:

    1. 在MySQL中执行以下命令,将源表a和目标表c都设置为使用ROW模式:
    
    SET sql_mode = 'STRICT_TRANS_TABLES';
    SET @@session.sql_mode = 'STRICT_TRANS_TABLES';
    
    1. 然后再执行INSERT INTO语句进行双流left join后再入库mysql的操作。

    如果还是无法解决问题,可以考虑升级MySQL版本或者使用其他工具来进行数据同步。

    2023-07-27 13:34:46
    赞同 展开评论 打赏

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

相关产品

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

    更多
    搭建电商项目架构连接MySQL 立即下载
    搭建4层电商项目架构,实战连接MySQL 立即下载
    PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

    相关镜像