Flink CDC系列之:Kafka 变更日志 JSON 格式工厂类 ChangeLogJsonFormatFactory

这是一个 变更日志 JSON 格式工厂类,负责根据配置创建不同类型的 JSON 序列化器。

类概述

java 复制代码
@Internal
public class ChangeLogJsonFormatFactory
  • @Internal:标记为内部类,不推荐用户直接使用
  • 工厂模式:根据配置参数创建对应的 JSON 序列化器实例

核心方法详解
createSerializationSchema() - 创建序列化器

java 复制代码
public static SerializationSchema<Event> createSerializationSchema(
        ReadableConfig formatOptions, 
        JsonSerializationType type, 
        ZoneId zoneId) {

参数说明:

  • formatOptions:格式配置选项
  • type:JSON 序列化类型(Debezium 或 Canal)
  • zoneId:时区配置

配置解析流程

构建配置前缀

java 复制代码
final String prefix = type.toString() + ".";

作用:根据序列化类型构建配置项的前缀。

示例:

  • Debezium: "debezium-json."
  • Canal: "canal-json."

解析 Debezium Schema 包含配置

java 复制代码
boolean isIncludedDebeziumSchema =
        Boolean.parseBoolean(
                formatOptions
                        .toMap()
                        .get(
                                DEBEZIUM_JSON_INCLUDE_SCHEMA_ENABLED
                                        .key()
                                        .substring(prefix.length())));

配置键处理:

  • 完整配置键:debezium-json.include-schema.enabled
  • 去掉前缀后:include-schema.enabled
  • 从配置映射中获取值

解析通用 JSON 格式配置

时间戳格式

java 复制代码
TimestampFormat timestampFormat = JsonFormatOptionsUtil.getTimestampFormat(formatOptions);

选项:

  • SQL:"2023-11-24 15:30:00"
  • ISO-8601:"2023-11-24T15:30:00Z"

Map中null键处理模式

java 复制代码
JsonFormatOptions.MapNullKeyMode mapNullKeyMode =
        JsonFormatOptionsUtil.getMapNullKeyMode(formatOptions);

模式:

  • DROP:丢弃null键
  • FAIL:抛出异常
  • LITERAL:使用指定文本替换

Map中null键替换文本

java 复制代码
String mapNullKeyLiteral = formatOptions.get(JSON_MAP_NULL_KEY_LITERAL);

示例:"null", "NULL", ""

Decimal编码方式

java 复制代码
final boolean encodeDecimalAsPlainNumber =
        formatOptions.get(ENCODE_DECIMAL_AS_PLAIN_NUMBER);
  • true:123.45 → 123.45
  • false:123.45 → "123.45"

忽略null字段

java 复制代码
final boolean ignoreNullFields =
        JsonRowDataSerializationSchemaUtils.enableIgnoreNullFields(formatOptions);
  • true:忽略null字段,不输出到JSON
  • false:包含null字段,输出为null

序列化器创建逻辑
Debezium JSON 序列化器

java 复制代码
case DEBEZIUM_JSON:
    {
        return new DebeziumJsonSerializationSchema(
                timestampFormat,           // 时间戳格式
                mapNullKeyMode,            // null键处理模式
                mapNullKeyLiteral,         // null键替换文本
                zoneId,                    // 时区
                encodeDecimalAsPlainNumber, // Decimal编码方式
                ignoreNullFields,          // 是否忽略null字段
                isIncludedDebeziumSchema); // 是否包含Schema信息
    }

额外参数:isIncludedDebeziumSchema

  • 控制是否在输出中包含表结构信息
  • 仅 Debezium 格式支持此特性

实际使用场景
场景1:完整数据同步

java 复制代码
// 使用 Debezium 格式,包含Schema信息
ReadableConfig config = Configuration.fromMap(
    "debezium-json.include-schema.enabled" -> "true",
    "debezium-json.timestamp-format" -> "ISO-8601"
);

SerializationSchema<Event> schema = 
    ChangeLogJsonFormatFactory.createSerializationSchema(
        config, 
        JsonSerializationType.DEBEZIUM_JSON, 
        ZoneId.of("UTC"));

总结:ChangeLogJsonFormatFactory 是一个配置驱动的工厂类,它:

✅ 统一创建接口:为不同 JSON 格式提供一致的创建方式

✅ 完整配置支持:解析所有 JSON 格式相关的配置选项

✅ 类型安全:通过枚举确保只创建支持的序列化器类型

✅ 易于扩展:支持添加新的 JSON 格式序列化器

✅ 生产就绪:包含完整的错误处理和配置验证

这个工厂类使得 Flink CDC 能够灵活地支持多种 JSON 格式,满足不同业务场景和数据集成需求。

相关推荐
talle202118 小时前
Hive | json数据处理
hive·hadoop·json
一起养小猫19 小时前
Flutter for OpenHarmony 实战:网络请求与JSON解析完全指南
网络·jvm·spring·flutter·json·harmonyos
雪碧聊技术19 小时前
JSON数据格式
json·fastjson
从此不归路20 小时前
Qt5 进阶【12】JSON/XML 数据协议处理:与后端/配置文件的对接
xml·开发语言·c++·qt·json
说给风听.1 天前
零基础学 JSON:原理、语法与应用全解析
json
天若有情6732 天前
XiangJsonCraft v1.2.0重大更新解读:本地配置优先+全量容错,JSON解耦开发体验再升级
前端·javascript·npm·json·xiangjsoncraft
Sylvia33.2 天前
足球“文字直播/事件流”API详解:解码比赛的数字DNA
java·服务器·前端·json
Elieal2 天前
统一 JSON 格式,JacksonObjectMapper 定制 Spring Boot JSON 转换规则
spring boot·json·状态模式
像风一样自由20202 天前
解决百度网盘安装报错:D 盘 package.json 触发 Electron ESM/CJS 冲突
javascript·electron·json
灰太狼大王灬3 天前
OCR-RenameStudio是一个基于 PaddleOCR-json的桌面工具——Umi-OCR 智能重命名助手
json·ocr