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 格式,满足不同业务场景和数据集成需求。