1. 概述
MySQL Load 是 Apache Doris 中一种同步导入方式,通过 MySQL 协议的 LOAD DATA 语法导入本地文件。
特点
- 同步执行:执行后立即返回导入结果
- 原子性:单批任务全部成功或全部失败
- 适用规模:建议用于 10GB 以下文件
- 协议兼容:使用标准 MySQL 语法
2. 使用场景与限制
支持格式
- 客户端本地 CSV 文件
- 程序数据流
重要限制
-- 空值表示:使用 \N
a, \N, b -- 中间列为 NULL
-- 空字符串表示:直接置空
a, , b -- 中间列为空字符串
3. 工作原理
MySQL Load 复用 Stream Load 的导入能力,流程如下:
4. 快速上手
前置检查
需要目标表的 INSERT 权限:
GRANT INSERT ON database.table TO 'user';
完整示例
-
准备测试数据 (
client_local.csv)
1,10
2,20
3,30
4,40
5,50
6,60
-
连接客户端(必须使用
--local-infile)
mysql --local-infile -h <fe_ip> -P <fe_query_port> -u root -D testdb
- 创建测试表
CREATE TABLE testdb.tl (
pk INT,
v1 INT SUM
) AGGREGATE KEY (pk)
DISTRIBUTED BY hash (pk);
- 执行导入命令
LOAD DATA LOCAL
INFILE 'client_local.csv'
INTO TABLE testdb.tl
COLUMNS TERMINATED BY ','
LINES TERMINATED BY '\n';
结果查看
成功结果:
Query OK, 6 row affected (0.17 sec)
Records: 6 Deleted: 0 Skipped: 0 Warnings: 0
失败处理:
-- 查看具体错误信息
SHOW LOAD WARNINGS WHERE label='b612907c-***f4-4ac2-82fe-107ece655f0f';
5. 完整语法参考
基础语法
LOAD DATA LOCAL
INFILE '<load_data_file>'
INTO TABLE [<db_name>.][<table_name>]
[PARTITION (partition_name[, ...])]
[COLUMNS TERMINATED BY '<column_terminated_operator>']
[LINES TERMINATED BY '<line_terminated_operator>']
[IGNORE <ignore_lines> LINES]
[(col_name_or_user_var[, ...])]
[SET col_name=[expr | DEFAULT], ...]
[PROPERTIES (key1 = value1[, ...])]
参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
max_filter_ratio |
最大过滤率 (0-1) | 0 |
timeout |
超时时间(秒) | 600 |
strict_mode |
严格模式 | false |
timezone |
时区 | +08:00 |
exec_mem_limit |
内存限制 | 2GB |
trim_double_quotes |
裁剪外层双引号 | false |
enclose |
包围符 | - |
escape |
转义符 | - |
6. 实用示例
6.1 设置超时时间
LOAD DATA LOCAL
INFILE 'testData'
INTO TABLE testDb.testTbl
PROPERTIES ("timeout"="100");
6.2 设置容错率
LOAD DATA LOCAL
INFILE 'testData'
INTO TABLE testDb.testTbl
PROPERTIES ("max_filter_ratio"="0.2");
6.3 列映射
LOAD DATA LOCAL
INFILE 'testData'
INTO TABLE testDb.testTbl
(k2, k1, v1); -- 调整列顺序
6.4 指定分隔符
LOAD DATA LOCAL
INFILE 'testData'
INTO TABLE testDb.testTbl
COLUMNS TERMINATED BY ','
LINES TERMINATED BY '\n';
6.5 指定分区
LOAD DATA LOCAL
INFILE 'testData'
INTO TABLE testDb.testTbl
PARTITION (p1, p2); -- 只导入到指定分区
6.6 设置时区
LOAD DATA LOCAL
INFILE 'testData'
INTO TABLE testDb.testTbl
PROPERTIES ("timezone"="Africa/Abidjan");
6.7 内存限制
LOAD DATA LOCAL
INFILE 'testData'
INTO TABLE testDb.testTbl
PROPERTIES ("exec_mem_limit"="10737418240"); -- 10GB
7. 注意事项
-
连接参数:必须使用
--local-infile或allowLoadLocalInfile=true - 文件大小:建议单个文件 < 10GB
- 取消操作:无法手动取消,超时或错误后自动取消
-
错误排查:使用
SHOW LOAD WARNINGS查看详细错误 - 数据格式:严格区分 NULL 和空字符串
8. 总结
MySQL Load 提供了熟悉且强大的数据导入方式,特别适合:
- 小规模数据快速导入
- 需要同步确认结果的场景
- 从 MySQL 生态迁移的用户