MySql Load
mysql-load: 使用MySql客户端导入本地数据
导入方式是同步导入。
```
LOAD DATA
[LOCAL]
INFILE 'file_name'
INTO TABLE tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[COLUMNS TERMINATED BY 'string']
[LINES TERMINATED BY 'string']
[IGNORE number {LINES | ROWS}]
[(col_name_or_user_var [, col_name_or_user_var] ...)]
[SET (col_name={expr | DEFAULT} [, col_name={expr | DEFAULT}] ...)]
[PROPERTIES (key1 = value1 [, key2=value2]) ]
```
该语句用于向指定的 table 导入数据,与普通Load区别是,这种导入方式是同步导入。
这种导入方式仍然能够保证一批导入任务的原子性,要么全部数据导入成功,要么全部失败。
1. MySQL Load以语法`LOAD DATA`开头, 无须指定LABEL
2. 指定`LOCAL`表示读取客户端文件.不指定表示读取FE服务端本地文件. 导入FE本地文件的功能默认是关闭的, 需要在FE节点上设置`mysql_load_server_secure_path`来指定安全路径, 才能打开该功能.
3. `INFILE`内填写本地文件路径, 可以是相对路径, 也可以是绝对路径.目前只支持单个文件, 不支持多个文件
4. `INTO TABLE`的表名可以指定数据库名, 如案例所示. 也可以省略, 则会使用当前用户所在的数据库.
5. `PARTITION`语法支持指定分区导入
6. `COLUMNS TERMINATED BY`指定列分隔符
7. `LINES TERMINATED BY`指定行分隔符
8. `IGNORE num LINES`用户跳过CSV的表头, 可以跳过任意行数. 该语法也可以用`IGNORE num ROWS`代替
9. 列映射语法, 具体参数详见[导入的数据转换](../../../../data-operate/import/import-way/mysql-load-manual.md) 的列映射章节
10. `PROPERTIES`参数配置
max_filter_ratio(0-1):最大容忍可过滤(数据不规范等原因)的数据比例。默认零容忍。
timeout: 指定导入的超时时间。单位秒。默认是 600 秒。可设置范围为 1 秒 ~ 259200 秒。
strict_mode: 用户指定此次导入是否开启严格模式,默认为关闭。
timezone: 指定本次导入所使用的时区。默认为东八区。该参数会影响所有导入涉及的和时区有关的函数结果。
exec_mem_limit: 导入内存限制。默认为 2GB。单位为字节。
trim_double_quotes: 布尔类型,默认值为 false,为 true 时表示裁剪掉导入文件每个字段最外层的双引号。
enclose: 包围符。当csv数据字段中含有行分隔符或列分隔符时,为防止意外截断,可指定单字节字符作为包围符起到保护作用。例如列分隔符为",",包围符为"'",数据为"a,'b,c'",则"b,c"会被解析为一个字段。
escape: 转义符。用于转义在csv字段中出现的与包围符相同的字符。例如数据为"a,'b,'c'",包围符为"'",希望"b,'c被作为一个字段解析,则需要指定单字节转义符,例如"\",然后将数据修改为"a,'b,\'c'"。
1.1示例
1. 建表
CREATE TABLE IF NOT EXISTS load_local_file_test
(
id INT,
age TINYINT,
name VARCHAR(50)
)
unique key(id)
DISTRIBUTED BY HASH(id) BUCKETS 3;
2. 生成测试数据
vim a.txt
1,23,'zs'
2,34,'ww'
...
3. 在 fe 端服务器上执行导入命令
mysql --local-infile -h cdh004 -P 9930 -uroot
mysql> load data local infile '/opt/apache-doris-2.0.3-bin-x64/a.txt' into table load_local_file_test COLUMNS TERMINATED BY ',' LINES TERMINATED BY '\n' ;
Query OK, 2 rows affected (0.05 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
注意 :
MySQL 客户端需要添加 '--local-infile' 参数,否则会报 ERROR 2027 (HY000): Malformed packet 错误;
执行 load data local 命令时文件中字段分隔符不是 '\t' 时需要添加 'COLUMNS TERMINATED BY ','' 否则会报 ERROR 1105 (HY000): errCode = 2, detailMessage = [INTERNAL_ERROR]too many filtered rows 错误;
4. 不在 fe 端服务器上执行导入命令
修改 fe.conf 配置文件,添加 mysql_load_server_secure_path='在 fe 服务器上文件所在目录'
mysql -h cdh003 -u root -p root
MySQL [test]> load data infile '/opt/apache-doris-2.0.3-bin-x64/a.txt' into table load_local_file_test COLUMNS TERMINATED BY ',' LINES TERMINATED BY '\n' ;
Query OK, 2 rows affected (3.699 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
注意 :
MySQL 客户端不需要添加 '--local-infile' 参数;
执行 load data 命令时后面添加 local 是导入当前客户端,infile 指定目录下的文件,不添加 local 是导入服务器端 infile 指定目录下的文件;
文件中字段分隔符不是 '\t' 时需要添加 'COLUMNS TERMINATED BY ','';
导入服务端本地文件的语法和导入客户端语法的唯一区别是LOAD DATA关键词后面是否加入LOCAL关键字.
FE为多节点部署, 导入服务端文件功能只能够导入客户端连接的FE节点, 无法导入其他FE节点本地的文件.
服务端导入默认是关闭, 通过设置FE的配置mysql_load_server_secure_path开启, 导入文件的必须在该目录下.
1.2 配置项
mysql_load_thread_pool 控制单个FE中MySQL Load并发执行线程个数, 默认为4. 线程池的排队队列大小为mysql_load_thread_pool的5倍, 因此默认情况下, 可以并发提交的任务为 4 + 4*5 = 24个. 如果并发个数超过24时, 可以调大该配置项.
mysql_load_server_secure_path 服务端导入的安全路径, 默认为空, 即不允许服务端导入. 如需开启这个功能, 建议在DORIS_HOME目录下创建一个local_import_data目录, 用于导入数据.
mysql_load_in_memory_record 失败的任务记录个数, 该记录会保留在内存中, 默认只会保留最近的20. 如果有需要可以调大该配置. 在内存中的记录, 有效期为1天, 异步清理线程会固定一天清理一次过期数据.
Stream Load
Stream Load 用于将本地文件导入到 Doris 中。
Stream Load 是通过 HTTP 协议与 Doris 进行连接交互的。
导入方式是同步导入。
curl 命令导入本地文件:
curl --location-trusted -u root: -H "label:load_local_file_test" -H "column_separator:," -T /opt/apache-doris-2.0.3-bin-x64/a.txt http://cdh004:8840/api/test/load_local_file_test/_stream_load
参数 | 说明 |
label | 一次导入的标签,相同标签的数据无法多次导入。用户可以通过指定Label的方式来避免一份数据重复导入的问题。 当前Doris内部保留30分钟内最近成功的label。 |
column_separator | 用于指定导入文件中的列分隔符,默认为\t。如果是不可见字符,则需要加\x作为前缀,使用十六进制来表示分隔符。 如hive文件的分隔符\x01,需要指定为-H "column_separator:\x01"。 可以使用多个字符的组合作为列分隔符。 |
line_delimiter | 用于指定导入文件中的换行符,默认为\n。可以使用做多个字符的组合作为换行符。 |
columns | 用于指定导入文件中的列和 table 中的列的对应关系。如果源文件中的列正好对应表中的内容,那么是不需要指定这个字段的内容的。 如果源文件与表schema不对应,那么需要这个字段进行一些数据转换。这里有两种形式column,一种是直接对应导入文件中的字段,直接使用字段名表示; 一种是衍生列,语法为 column_name = expression。举几个例子帮助理解。 例1: 表中有3个列“c1, c2, c3”,源文件中的三个列一次对应的是"c3,c2,c1"; 那么需要指定-H "columns: c3, c2, c1" 例2: 表中有3个列“c1, c2, c3", 源文件中前三列依次对应,但是有多余1列;那么需要指定-H "columns: c1, c2, c3, xxx"; 最后一个列随意指定个名称占位即可 例3: 表中有3个列“year, month, day"三个列,源文件中只有一个时间列,为”2018-06-01 01:02:03“格式; 那么可以指定-H "columns: col, year = year(col), month=month(col), day=day(col)"完成导入 |
where | 用于抽取部分数据。用户如果有需要将不需要的数据过滤掉,那么可以通过设定这个选项来达到。 例1: 只导入大于k1列等于20180601的数据,那么可以在导入时候指定-H "where: k1 = 20180601" |
max_filter_ratio | 最大容忍可过滤(数据不规范等原因)的数据比例。默认零容忍。数据不规范不包括通过 where 条件过滤掉的行。 |
partitions | 用于指定这次导入所设计的partition。如果用户能够确定数据对应的partition,推荐指定该项。不满足这些分区的数据将被过滤掉。 比如指定导入到p1, p2分区,-H "partitions: p1, p2" |
timeout | 指定导入的超时时间。单位秒。默认是 600 秒。可设置范围为 1 秒 ~ 259200 秒。 |
strict_mode | 用户指定此次导入是否开启严格模式,默认为关闭。开启方式为 -H "strict_mode: true"。 |
timezone | 指定本次导入所使用的时区。默认为东八区。在本次导入事务中,该变量起到了替代session variable time_zone 的作用。详情请见最佳实践中“涉及时区的导入”一节。 |
exec_mem_limit | 导入内存限制。默认为 2GB。单位为字节。 |
format | 指定导入数据格式,支持csv、json、 csv_with_names(支持csv文件行首过滤)、csv_with_names_and_types(支持csv文件前两行过滤)、parquet、orc,默认是csv。 |
jsonpaths | 导入json方式分为:简单模式和匹配模式。 简单模式:没有设置jsonpaths参数即为简单模式,这种模式下要求json数据是对象类型,例如:
匹配模式:用于json数据相对复杂,需要通过jsonpaths参数匹配对应的value。 |
strip_outer_array | 布尔类型,为true表示json数据以数组对象开始且将数组对象中进行展平,默认值是false。例如:
|
json_root | json_root为合法的jsonpath字符串,用于指定json document的根节点,默认值为""。 |
merge_type | 数据的合并类型,一共支持三种类型APPEND、DELETE、MERGE 其中,APPEND是默认值,表示这批数据全部需要追加到现有数据中,DELETE 表示删除与这批数据key相同的所有行,MERGE 语义 需要与delete 条件联合使用,表示满足delete 条件的数据按照DELETE 语义处理其余的按照APPEND 语义处理, 示例:-H "merge_type: MERGE" -H "delete: flag=1" |
delete | 仅在 MERGE下有意义,表示数据的删除条件 |
function_column.sequence_col | 只适用于UNIQUE_KEYS,相同key列下,保证value列按照source_sequence列进行REPLACE, source_sequence可以是数据源中的列,也可以是表结构中的一列。 |
fuzzy_parse | 布尔类型,为true表示json将以第一行为schema 进行解析,开启这个选项可以提高 json 导入效率,但是要求所有json 对象的key的顺序和第一行一致, 默认为false,仅用于json 格式 |
num_as_string | 布尔类型,为true表示在解析json数据时会将数字类型转为字符串,然后在确保不会出现精度丢失的情况下进行导入。 |
read_json_by_line | 布尔类型,为true表示支持每行读取一个json对象,默认值为false。 |
send_batch_parallelism | 整型,用于设置发送批处理数据的并行度,如果并行度的值超过 BE 配置中的 |
hidden_columns | 用于指定导入数据中包含的隐藏列,在Header中不包含columns时生效,多个hidden column用逗号分割。
|
load_to_single_tablet | 布尔类型,为true表示支持一个任务只导入数据到对应分区的一个 tablet,默认值为 false,该参数只允许在对带有 random 分桶的 olap 表导数的时候设置。 |
compress_type | 指定文件的压缩格式。目前只支持 csv 文件的压缩。支持 gz, lzo, bz2, lz4, lzop, deflate 压缩格式。 |
trim_double_quotes | 布尔类型,默认值为 false,为 true 时表示裁剪掉 csv 文件每个字段最外层的双引号。 |
skip_lines | 整数类型, 默认值为0, 含义为跳过csv文件的前几行. 当设置format设置为 csv_with_names 或、csv_with_names_and_types 时, 该参数会失效. |
comment | 字符串类型, 默认值为空. 给任务增加额外的信息. |
enclose | 包围符。当csv数据字段中含有行分隔符或列分隔符时,为防止意外截断,可指定单字节字符作为包围符起到保护作用。例如列分隔符为",",包围符为"'",数据为"a,'b,c'",则"b,c"会被解析为一个字段。 |
escape | 转义符。用于转义在字段中出现的与包围符相同的字符。例如数据为"a,'b,'c'",包围符为"'",希望"b,'c被作为一个字段解析,则需要指定单字节转义符,例如"\",然后将数据修改为"a,'b,\'c'"。 |
本文暂时没有评论,来添加一个吧(●'◡'●)