我们在利用datax进行离线数据迁移的时候,需要在json里配置源端和目标端的表字段信息,如果是少量的表可以配置完数据库连接信息后直接执行该任务的json信息获取源端和目标端的数据库信息,但是如果需要迁移的对象比较多,比如我们在某金融客户现场迁移hive hdfs的历史数据到某国产数据库mysql模式的时候,涉及的表比较多,其中存在大量的分表,当时采用的是原始方式手搓涉及表的json文件,在最近的一次项目中也遇到类似情况,想借此项目生成一个自动生成json的功能,以下为理论阶段,待验证。
另外有兴趣的朋友可以借助ai功能结合datax的抽数功能开发一套带web界面的离线同步工具,具体的可以搜搜datax web信息。
以下为理论方案:
基于阿里云 DataX 现有功能,实现配置文件自动生成主要有几种典型方案。下面从**轻量脚本**到**平台化方案**逐一说明,并附可直接参考的实现思路。
方案一:利用 DataX 内置模板命令(最快上手)
DataX 自带模板生成功能,适合快速获取基础骨架:
```bash
python datax.py -r mysqlreader -w mysqlwriter > job.json
```
这条命令会输出一个包含 `reader` 和 `writer` 完整参数结构的 JSON 模板,手动填充连接信息和表名即可使用。
如果只是偶尔生成一两个配置,这种方式最简单。但它的局限也很明显:**不批量、不读取元数据、不自动填字段**。
方案二:Python 脚本批量生成(推荐,灵活度高)
这是最实用的方案。核心思路是**连接源库读取表结构元数据,用模板引擎渲染出 JSON**。
脚本设计思路
**第一步:获取表清单和字段信息**
通过查询 `INFORMATION_SCHEMA` 获取表的列名和类型。对于 MySQL:
python
def get_table_columns(conn, schema, table_name):
sql = """
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s
ORDER BY ORDINAL_POSITION
"""
with conn.cursor() as cur:
cur.execute(sql, (schema, table_name))
return cur.fetchall() # [(col_name, data_type), ...]
**第二步:类型映射**
DataX 的 `column` 配置需要指定 `type`,必须与源端数据类型对应。需要一张映射表:
html
MySQL 类型 DataX 类型
int / bigint / tinyint long
varchar / char / text string
decimal / float / double double
date / datetime / timestamp date
其他 string(兜底)
**第三步:模板渲染**
用 Python 内置的 `string.Template` 或 `Jinja2` 生成 JSON。核心逻辑示例:
python
import json
from datetime import datetime
def build_job_config(reader_conn, writer_conn, table_name, columns):
reader_columns = [
{"name": col, "type": mysql_to_datax_type(dtype)}
for col, dtype in columns
]
config = {
"job": {
"setting": {
"speed": {"channel": 3},
"errorLimit": {"record": 0, "percentage": 0.02}
},
"content": [{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": reader_conn["user"],
"password": reader_conn["password"],
"column": [c["name"] for c in reader_columns],
"splitPk": "id",
"connection": [{
"table": [table_name],
"jdbcUrl": [reader_conn["url"]]
}]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"username": writer_conn["user"],
"password": writer_conn["password"],
"column": [c["name"] for c in reader_columns],
"writeMode": "insert",
"batchSize": 1024,
"connection": [{
"table": [table_name],
"jdbcUrl": writer_conn["url"]
}]
}
}
}]
}
}
return config
**第四步:批量输出**
```python
python
import os
table_list = read_table_list("table.list") # 每行一个表名
output_dir = "datax_jobs"
os.makedirs(output_dir, exist_ok=True)
for table in table_list:
columns = get_table_columns(reader_conn, schema, table)
config = build_job_config(reader_conn, writer_conn, table, columns)
filename = f"{output_dir}/{table}.json"
with open(filename, "w", encoding="utf-8") as f:
json.dump(config, f, ensure_ascii=False, indent=2)
print(f"[OK] {table} -> {filename}")
关键细节
**writer 的 type 必须与目标表结构一致**。如果目标端是 MySQL,`writeMode` 可选 `insert` / `replace` / `update`。特别注意你之前遇到的 `"M"` 无法转为 `Long` 的问题------**类型映射阶段要严格按目标表定义来,不能只按源表**。
**分片键的选择**:`splitPk` 建议用主键或索引列,否则 DataX 会退化为单通道读取,速度会明显下降。
**密码安全**:脚本中不要硬编码密码,建议通过环境变量或外部配置文件传入。
方案三:Shell 脚本模板替换(适合运维场景)
如果环境无法安装 Python 依赖,可以用 Shell + `sed` 做简单替换。崖山数据库官方提供的 `yas_dataxmove_auto_create_json.sh` 就是这种思路:
python
#!/bin/bash
TABLE_LIST="table.list"
TEMPLATE="template.json"
SCHEMA="$1"
OUTPUT_DIR="json"
mkdir -p "$OUTPUT_DIR"
while read -r table; do
sed "s/{{TABLE}}/$table/g; s/{{SCHEMA}}/$SCHEMA/g" \
"$TEMPLATE" > "$OUTPUT_DIR/${table}.json"
echo "[OK] ${table}.json generated"
done < "$TABLE_LIST"
配合一个占位符模板:
XML
{
"job": {
"content": [{
"reader": {
"name": "mysqlreader",
"parameter": {
"connection": [{
"table": ["{{TABLE}}"],
"jdbcUrl": ["jdbc:mysql://{{HOST}}:3306/{{SCHEMA}}"]
}]
}
},
"writer": { ... }
}]
}
}
这种方式**不读取元数据**,字段需要提前在模板里写好,适合表结构统一、只需要换表名的场景。
方案四:DolphinScheduler / DataX-Web 参数化模板(平台化方案)
如果已经有调度平台,推荐用**参数化模板 + 动态传参**的方式,完全不用生成独立文件。
DataX 本身支持 `-p "-Dparam=value"` 动态传参,JSON 里用 `$param` 引用:
python
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "$MYSQL_USER",
"connection": [{
"table": ["$TABLE_NAME"],
"jdbcUrl": ["jdbc:mysql://$MYSQL_HOST:3306/$MYSQL_DB"]
}]
}
}
}
执行时:
```bash
python datax.py -p "-DMYSQL_USER=root -DTABLE_NAME=user_info job.json"
```
DolphinScheduler 进一步把这套机制封装成了可视化配置:在任务参数里定义 `source_table`、`output_path` 等变量,调度时自动注入,**一个模板可以复用所有表**。
DataX-Web 也提供了类似能力------从已配置的数据源中直接选表,自动读取表结构和字段信息,一键生成标准 JSON 配置。
推荐选型
| 场景 | 推荐方案 |
|---|---|
| 偶尔生成 1-2 个配置 | 方案一(DataX 内置模板) |
| 批量迁移、需要读取元数据 | **方案二(Python 脚本)** |
| 运维环境无 Python 依赖 | 方案三(Shell + sed) |
| 已有调度平台 | 方案四(参数化模板) |
**方案二是最通用的选择**。核心要点有三个:用 `INFORMATION_SCHEMA` 读列名、维护一张 MySQL→DataX 的类型映射表、用 JSON 序列化保证格式正确。建议把数据库连接信息抽到独立配置文件(如 `config.ini`),脚本只负责读元数据和渲染模板。