本文将深入介绍如何在使用 DataX 进行数据同步的过程中,利用 Transformer
模块实现灵活、高效的数据转换操作。适用于数据仓库建设、数据库迁移、数据清洗等场景,涵盖图解、原理解析与代码实战,助你快速掌握 DataX 的转换能力。
🧭 目录
- 什么是 DataX 与 Transformer?
- 数据同步场景下的转换需求
- DataX Transformer 架构原理图
- Transformer 类型与常用操作汇总
- 实战一:字符串转时间格式
- 实战二:字段拼接与拆分
- 实战三:字段清洗(去空格、默认值处理)
- 自定义 Transformer 插件开发指南
- 使用建议与最佳实践
- 总结与拓展方向
一、什么是 DataX 与 Transformer?
✅ DataX 简介
DataX 是阿里巴巴开源的离线数据同步工具,支持多种数据源之间的数据传输,如 MySQL → HDFS、Oracle → Hive、MongoDB → PostgreSQL 等。
✅ Transformer 模块
Transformer 是 DataX 从 v3.0 版本开始引入的“数据转换插件系统”,可以在同步过程中对字段做:
- 格式转换(时间、数字、JSON 等)
- 清洗处理(空值处理、标准化)
- 字段拼接与拆分
- 字段级别的函数处理(hash、substring)
二、数据同步中的转换需求示例
场景 | 需求 | 转换 |
---|
日志字段同步 | "2025-06-19 12:00:00" → timestamp | dx_date_transformer |
手机号加密 | 13312345678 → md5(xxx) | dx_md5_transformer |
地址拆分 | "北京市,海淀区" → "北京市" 、"海淀区" | dx_split_transformer |
空字段处理 | null → "默认值" | dx_replace_null_transformer |
三、DataX Transformer 架构原理图
+------------------+
| Reader | <-- 从源读取数据(如 MySQL)
+--------+---------+
|
v
+---------------------+
| Transformer | <-- 对每个字段进行转换处理
| (可多个叠加执行) |
+--------+------------+
|
v
+------------------+
| Writer | <-- 写入目标端(如 Hive)
+------------------+
四、常用 Transformer 列表与用途
Transformer 名称 | 功能 | 参数示例 |
---|
dx\_date\_transformer | 日期格式转换 | format="yyyy-MM-dd" |
dx\_replace\_null | null 替换 | replaceWith="N/A" |
dx\_substr | 字符串截取 | begin=0, end=3 |
dx\_upper | 转大写 | - |
dx\_split | 字符串拆分 | delimiter="," index=0 |
dx\_hash | 哈希加密 | algorithm="md5" |
五、实战一:字符串转时间格式
💡 需求:将字符串字段 2024-01-01
转为标准时间戳
"transformer": [
{
"name": "dx_date_transformer",
"parameter": {
"format": "yyyy-MM-dd",
"columnIndex": 1,
"columnType": "string"
}
}
]
👆 配置说明:
columnIndex
: 指定第几列(从 0 开始)format
: 源字符串的日期格式- 转换后自动成为时间类型,方便写入时间字段
六、实战二:字段拼接与拆分
💡 需求:将 "北京市,海淀区"
拆成两个字段
配置两个拆分 Transformer:
"transformer": [
{
"name": "dx_split",
"parameter": {
"delimiter": ",",
"index": 0,
"columnIndex": 2
}
},
{
"name": "dx_split",
"parameter": {
"delimiter": ",",
"index": 1,
"columnIndex": 2
}
}
]
注意:两次拆分结果会依次追加到行末
七、实战三:字段清洗(去空格、默认值处理)
"transformer": [
{
"name": "dx_trim", // 去除前后空格
"parameter": {
"columnIndex": 3
}
},
{
"name": "dx_replace_null",
"parameter": {
"replaceWith": "未知",
"columnIndex": 3
}
}
]
适用于老旧系统导出的 CSV、Excel 等格式字段清洗
八、自定义 Transformer 插件开发指南
DataX 支持通过 Java 自定义开发 Transformer 插件。
1️⃣ 开发流程:
- 创建类继承
com.alibaba.datax.transformer.Transformer
- 重写
evaluate
方法实现转换逻辑 - 配置
plugin.json
文件,声明插件信息 - 打包为 JAR 并放入
datax/plugin/transformer/
目录
示例:自定义加法 Transformer
public class AddTransformer extends Transformer {
public AddTransformer() {
setTransformerName("dx_add");
}
@Override
public Record evaluate(Record record, Object... paras) {
int columnIndex = (Integer) paras[0];
int addValue = (Integer) paras[1];
Column col = record.getColumn(columnIndex);
int val = Integer.parseInt(col.asString());
record.setColumn(columnIndex, new LongColumn(val + addValue));
return record;
}
}
九、使用建议与最佳实践
建议 | 描述 |
---|
多转换顺序 | 转换器执行顺序严格按数组顺序依次作用 |
转换失败处理 | 建议开启 failover 策略(丢弃 or 替换) |
日志调试 | 加 -Ddatax.home 参数获取运行日志 |
自定义开发 | 如果内置转换器不足,Java 自定义插件是首选 |
性能考虑 | 避免太多转换器堆叠,适度预处理原始数据 |
十、总结与拓展方向
能力 | 工具 |
---|
字段格式化 | dx\_date\_transformer, dx\_upper |
清洗空值 | dx\_replace\_null, dx\_trim |
安全处理 | dx\_hash, 自定义加密插件 |
多字段处理 | 字段拼接、拆分、自定义逻辑组合 |
实时监控 | 与日志平台集成,跟踪 Transformer 失败行数 |
推荐拓展:
- ✅ 配合
Pre/Post Sql
实现同步前后表初始化 - ✅ 与
Writer
联动:写入目标前进行字段映射 - ✅ 与
Job 组合任务
配合:拆分复杂任务
评论已关闭