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

Flink CDCmysql 的时候,发现 null 值,这个有方法解决吗?

Flink CDCmysql 的时候,发现 null 值(该列配置有 default value )被填充为 default value 了,这个有方法解决吗?

展开
收起
cuicuicuic 2023-12-04 08:17:56 85 0
5 条回答
写回答
取消 提交回答
  • debezium的坑 .你试着升级下 flink cdc版本看看 ,此回答整理自钉群“Flink CDC 社区”

    2023-12-05 09:10:24
    赞同 展开评论 打赏
  • 在Flink CDC中,当从MySQL源读取数据时,如果某列配置了默认值(default value),而该列的值为NULL,则该列会被填充为默认值。

    如果您希望保留原始的NULL值而不进行默认值填充,可以考虑以下方法:

    1. 使用CDC的before字段:在CDC事件中,Flink CDC提供了before字段,其中包含了变更前的数据。您可以检查before字段是否为NULL,如果为NULL则表示原始值是NULL,可以选择使用该值。

    2. 自定义转换逻辑:通过自定义Flink CDC的数据处理逻辑,您可以在处理数据时检查每个字段的值,并根据需要进行相应的转换。您可以在Flink程序中编写自定义的Map或ProcessFunction来实现此逻辑,在处理过程中将NULL保持为原始值而不进行默认值填充。

    3. 修改数据库表定义:如果您有权限修改数据库表定义,可以尝试将默认值设置为NULL而不是其他具体的默认值。这样,在Flink CDC读取数据时,NULL值将被保留而不进行默认值填充。

    请注意,在使用上述方法时,要确保数据处理的一致性和正确性。对于特定的业务需求和数据情况,您可能需要进一步评估并测试所采用的解决方案。

    2023-12-04 20:36:38
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    这个问题是由于Flink CDC在读取源数据时,如果源表有default value,同步过来的数据会带上这个default值。对于如何解决这个问题,你可以尝试以下方式:

    1. 在Flink CDC配置中,显式地指定NULL值应该被插入到目标表中的对应字段,而不是使用默认值。这可以通过修改Flink CDC的配置文件来实现。具体的配置项和取值可以参考Flink CDC的官方文档或者社区中的相关讨论。

    2. 另一个可能的解决方案是在同步数据之前,先对源表进行预处理,将含有NULL值的行更新为相应的默认值。这种方式需要结合你的具体业务场景和数据特点来选择合适的处理策略。

    2023-12-04 13:47:45
    赞同 展开评论 打赏
  • 在使用Flink CDC同步MySQL表数据时,如果遇到null值被填充为default value的问题,目前暂无特定解决方案。这个问题可能是由于Flink CDC在读取binlog时,将字段的默认值也一起读取导致的。

    不过,您可以通过自定义转换函数的方式来处理这种问题。例如,您可以编写一个函数,该函数可以检查字段的值是否为默认值,如果是,则将其更改为null。这样,即使Flink CDC读取了默认值,也可以确保将这些值转换为正确的null值。

    同时要注意,对于任何数据库同步工具,无论是Canal还是StreamSet或者是Flink SQL CDC,它们都是基于binlog来实现数据的增量同步和数据变更同步的。因此,当遇到类似的问题时,理解其工作原理并灵活运用相应的处理手段是非常重要的。

    2023-12-04 11:17:17
    赞同 展开评论 打赏
  • 当你使用 Flink CDC 从 MySQL 读取数据时,发现默认值被填充到了具有 DEFAULT 值的列中,而不是期望的 null 值。这是因为 binlog(二进制日志)中的信息反映了数据库的操作,包括对表的更新和插入等操作。

    MySQL 的 binlog 中可能会包含关于 DEFAULT 值的信息,这取决于你的 binlog 格式设置。如果 binlog 使用的是 ROW 格式,那么它会记录每个字段的实际值,包括那些使用了默认值的字段。Flink CDC 在解析这些 binlog 事件时,通常会反映实际写入到数据库中的值,因此你会看到默认值而非 null

    如果你希望在 Flink CDC 中获取原始的 null 值而不是默认值,可能需要采取一些特殊措施:

    1. 配置 MySQL 的 binlog 格式:可以尝试将 binlog 格式设置为 MIXED 或 STATEMENT,这样 binlog 可能不会包含每个字段的值,而是包含 SQL 语句,这可能会允许 Flink CDC 捕获到 null 值。不过请注意,这种方式可能会影响其他工具或服务与 binlog 的兼容性。

    2. 处理 Flink CDC 输出:你可以在 Flink 应用程序中添加一个自定义的处理器或转换器来替换默认值。这可以通过检查特定字段是否等于默认值,并将其替换为 null 来实现。

    3. 直接访问 MySQL 数据库:作为替代方案,你可以考虑直接查询 MySQL 数据库以获取原始数据,而不仅仅是依赖于 binlog。这种方法可以确保你得到的是最准确的数据状态,但可能会影响到系统的实时性和性能。

    4. 升级或修改 Flink CDC 插件:如果上述方法都不适用,或者你想保持现有的 binlog 设置,你可能需要查看是否有相关的 Flink CDC 插件更新,或者是否有可能修改插件代码来适应你的需求。

    总的来说,解决这个问题可能需要权衡不同的因素,包括系统性能、数据准确性以及与其他工具和服务的兼容性。选择哪种方法取决于你的具体需求和环境。

    2023-12-04 09:21:11
    赞同 1 展开评论 打赏

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

相关产品

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

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