Flink CDC 自定义函数处理 SQLServer XML类型数据 映射 doris json字段方案

1. 背景

因业务使用SQLServer数据库,CDC同步到doris 数仓。对于SQLServer xml类型,doris没有相应的字段对应,

可以使用json来存储xml数据。需要进行一步转换。从 flink 自定义函数入手。

2. 解决方案

  • SQLServer xml 字段如下
xml 复制代码
<items>
  <item lng="zh-CN" value="银行货到付款" />
  <item lng="en" value="Bank transfer on delivery" />
</items>
  • doris 存储转换后的json内容
json 复制代码
{
    "item": [
        {
            "lng": "zh-CN",
            "value": "银行货到付款"
        },
        {
            "lng": "en",
            "value": "Bank transfer on delivery"
        }
    ]
}
  • flink 自定义函数代码
java 复制代码
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.apache.flink.table.functions.ScalarFunction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 将XML转换为JSON
 */
public class XmlToJson extends ScalarFunction {
    private Logger log = LoggerFactory.getLogger(XmlToJson.class);
    /**
     * 创建XmlMapper对象用于解析XML
     */
    private final XmlMapper xmlMapper = new XmlMapper();

    public String eval(String xml) {
        // 将XML字符串解析为JsonNode对象
        JsonNode jsonNode = null;
        try {
            jsonNode = xmlMapper.readTree(xml);
        } catch (JsonProcessingException e) {
            log.error("XML解析失败", e);
        }
        // 将JsonNode对象转换为JSON字符串
        return jsonNode.toString();
    }
}
  • doris 表
sql 复制代码
-- GName 为json格式
CREATE TABLE `table1` (
  `ID` int(11) NOT NULL COMMENT '字典表统一ID',
  `Name` varchar(600) NULL COMMENT '统一进行字典命名',
  `GName` json NULL COMMENT '采用xml存储多语言',
) ENGINE=OLAP
UNIQUE KEY(`ID`)
COMMENT '测试表'
DISTRIBUTED BY HASH(`ID`) BUCKETS AUTO
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"is_being_synced" = "false",
"storage_format" = "V2",
"enable_unique_key_merge_on_write" = "true",
"light_schema_change" = "true",
"disable_auto_compaction" = "false",
"enable_single_replica_compaction" = "false"
);
  • 注册自定义函数 sql调用转换
sql 复制代码
create temporary function xml_to_json as 'com.zfb.flink.udf.XmlToJson';
              
 INSERT INTO flink_doris (`ID`,`Name`, `GName`)
SELECT 
`ID`,
    `Name`, 
    xml_to_json(`GName`), 
    `TypeID`
FROM 
    table1;
   
  • doris json使用
sql 复制代码
select
	json_extract_string(GName, '$.item[0].value') as cn_name,
	*
from
	table1;  
相关推荐
用户3610588626124 小时前
Flink 窗口聚合函数详解及代码实现:从 ReduceFunction 到增量聚合 + ProcessWindowFunction 组合
大数据·flink
俊哥大数据6 小时前
基于 FlinkSQL + Paimon + Doris 的车联网流批一体湖仓实践 —— 第 1 章 业务背景与传统 Lambda 架构痛点
大数据·doris·湖仓一体·flinksql·paimon
俊哥大数据7 小时前
基于 FlinkSQL + Paimon + Doris 的车联网流批一体湖仓实践 —— 第 2 章 流批一体湖仓总体架构与三条分区契约铁律
flink·doris·湖仓一体·paimon
俊哥大数据7 小时前
基于 FlinkSQL + Paimon + Doris 的车联网流批一体湖仓实践 —— 第 4 章 Kafka 企标报文入湖(ODS 表设计)
flink·doris·湖仓一体·paimon·流批一体
俊哥大数据8 小时前
基于 FlinkSQL + Paimon + Doris 的车联网流批一体湖仓实践 —— 第 3 章 Paimon 1.4 湖仓底座与 Catalog 配置
flink·doris·湖仓一体·paimon
starzy19901 天前
Flink ResourceManager启动流程源码深度剖析:从ClusterEntrypoint到Slot分配的完整链路
java·大数据·flink
starzy19902 天前
Flink ApplicationMaster启动流程源码深度剖析:从YARN提交到JobMaster启动的完整链路
大数据·flink
hasty3 天前
policy.xml 在,不代表策略生效:ImageMagick 补丁给安全配置验收的提醒
xml·mysql·安全
用户3610588626123 天前
Flink Sliding Window 详解及代码实现:从窗口重叠到状态爆炸防控
大数据·flink
geovindu4 天前
sql: JSON and XML Data Handling in SQL using sql server 2025
大数据·数据库·sqlserver·数据库开发·数据库架构