CSV
更新时间:2025-05-29
本文介绍如何在 PALO 中导入 CSV 格式的数据文件。PALO 支持灵活的 CSV 格式配置,包括自定义分隔符、字段包围符等,并提供多种导入方式以满足不同场景的数据导入需求。
导入方式
PALO 支持以下方式导入 CSV 格式数据:
- Stream Load
- Broker Load
- Routine Load
- MySQL Load
- INSERT INTO FROM S3 TVF
- INSERT INTO FROM HDFS TVF
参数配置
参数支持情况
下表列出了各种导入方式支持的 CSV 格式参数:
参数 | 默认值 | Stream Load | Broker Load | Routine Load | MySQL Load | TVF |
---|---|---|---|---|---|---|
行分隔符 | \n |
line_delimiter | LINES TERMINATED BY | 不支持 | LINES TERMINATED BY | line_delimiter |
列分隔符 | \t |
column_separator | COLUMNS TERMINATED BY | COLUMNS TERMINATED BY | COLUMNS TERMINATED BY | column_separator |
包围符 | 无 | enclose | PROPERTIES.enclose | PROPERTIES.enclose | PROPERTIES.enclose | enclose |
转义符 | \ | escape | PROPERTIES.escape | PROPERTIES.escape | PROPERTIES.escape | escape |
|||||
跳过行数 | 0 | skip_lines | PROPERTIES.skip_lines | 不支持 | IGNORE LINES | skip_lines |
裁剪双引号 | false | trim_double_quotes | 不支持 | PROPERTIES.trim_double_quotes | 不支持 | trim_double_quotes |
压缩格式 | plain | compress_type | PROPERTIES.compress_type | 不支持 | 不支持 | compress_type |
注意:
- Stream Load:参数直接通过 HTTP Header 指定,如:
-H "line_delimiter:\n"
-
Broker Load:参数通过 SQL 语句指定,其中:
- 分隔符通过
COLUMNS TERMINATED BY
,LINES TERMINATED BY
指定 - 其他参数通过
PROPERTIES
指定,如:PROPERTIES("compress_type"="gz")
- 分隔符通过
-
Routine Load:参数通过 SQL 语句指定,其中:
- 分隔符通过
COLUMNS TERMINATED BY
指定 - 其他参数通过
PROPERTIES
指定,如:PROPERTIES("enclose"="\"")
- 分隔符通过
-
MySQL Load:参数通过 SQL 语句指定,其中:
- 分隔符通过
LINES TERMINATED BY
,COLUMNS TERMINATED BY
指定 - 其他参数通过
PROPERTIES
指定,如:PROPERTIES("escape"="\\")
- 分隔符通过
- TVF:参数通过 TVF 语句指定,如:
S3("line_delimiter"="\n")
参数说明
行分隔符
- 作用:指定导入文件中的换行符
- 默认值:
\n
- 特点:支持多个字符组合作为换行符
-
使用场景和示例:
-
Linux/Unix 系统文件:
Plain Text1数据文件: 2张三,25\n 3李四,30\n 4 5参数设置: 6line_delimiter:\n (默认值,可不设置)
-
Windows 系统文件:
Plain Text1数据文件: 2张三,25\r\n 3李四,30\r\n 4 5参数设置: 6line_delimiter:\r\n
-
特殊程序生成文件:
Plain Text1数据文件: 2张三,25\r 3李四,30\r 4 5参数设置: 6line_delimiter:\r
-
自定义多字符分隔符:
Plain Text1数据文件: 2张三,25|| 3李四,30|| 4 5参数设置: 6line_delimiter:||
-
列分隔符
- 作用:指定导入文件中的列分隔符
- 默认值:
\t
(制表符) -
特点:
- 支持可见和不可见字符
- 支持多字符组合
- 不可见字符需要使用
\x
前缀的十六进制表示
-
MySQL 协议特殊处理:
- 不可见字符需要额外增加反斜线
- 如 Hive 的
\x01
在 Broker Load 中需要写成\\x01
-
使用场景和示例:
-
常见可见字符:
Plain Text1数据文件: 2张三,25,北京 3李四,30,上海 4 5参数设置: 6column_separator:,
-
制表符(默认):
Plain Text1数据文件: 2张三 25 北京 3李四 30 上海 4 5参数设置: 6column_separator:\t (默认值,可不设置)
-
Hive 文件(Stream Load):
Plain Text1数据文件: 2张三\x0125\x01 北京 3李四\x0130\x01 上海 4 5参数设置: 6column_separator:\x01
-
Hive 文件(Broker Load):
Plain Text1数据文件: 2张三\x0125\x01 北京 3李四\x0130\x01 上海 4 5参数设置: 6PROPERTIES("column_separator"="\\x01")
-
多字符分隔符:
Plain Text1数据文件: 2张三||25||北京 3李四||30||上海 4 5参数设置: 6column_separator:||
-
包围符
- 作用:保护包含特殊字符的字段,防止被错误解析
- 限制:仅支持单字节字符
-
常用字符:
- 单引号:
'
- 双引号:
"
- 单引号:
-
使用场景和示例:
-
字段包含列分隔符:
Plain Text1数据:a,'b,c',d 2列分隔符:, 3包围符:' 4解析结果:3 个字段 [a] [b,c] [d]
-
字段包含行分隔符:
Plain Text1数据:a,'b\nc',d 2列分隔符:, 3包围符:' 4解析结果:3 个字段 [a] [b\nc] [d]
-
字段既包含列分隔符又包含行分隔符:
Plain Text1数据:a,'b,c\nd,e',f 2列分隔符:, 3包围符:' 4解析结果:3 个字段 [a] [b,c\nd,e] [f]
-
转义符
- 作用:转义字段中与包围符相同的字符
- 限制:仅支持单字节字符,默认为
\
-
使用场景和示例:
-
字段包含包围符:
Plain Text1数据:a,'b,\'c',d 2列分隔符:, 3包围符:' 4转义符:\ 5解析结果:3 个字段 [a] [b,'c] [d]
-
字段包含多个包围符:
Plain Text1数据:a,"b,\"c\"d",e 2列分隔符:, 3包围符:" 4转义符:\ 5解析结果:3 个字段 [a] [b,"c"d] [e]
-
字段包含转义符本身:
Plain Text1数据:a,'b\\c',d 2列分隔符:, 3包围符:' 4转义符:\ 5解析结果:3 个字段 [a] [b\c] [d]
-
跳过行数
- 作用:跳过 CSV 文件的前几行
- 类型:整数类型
- 默认值:0
-
特殊说明:
- 当 format 为
csv_with_names
时,系统会自动跳过首行(列名),忽略 skip_lines 参数 - 当 format 为
csv_with_names_and_types
时,系统会自动跳过前两行(列名和类型),忽略 skip_lines 参数
- 当 format 为
-
使用场景和示例:
-
跳过标题行:
Plain Text1数据文件: 2姓名,年龄,城市 3张三,25,北京 4李四,30,上海 5 6参数设置: 7skip_lines:1 8结果:跳过标题行,导入后续数据
-
跳过注释行:
Plain Text1数据文件: 2# 用户信息表 3# 创建时间:2024-01-01 4张三,25,北京 5李四,30,上海 6 7参数设置: 8skip_lines:2 9结果:跳过注释行,导入后续数据
-
使用 csv_with_names 格式:
Plain Text1数据文件: 2name,age,city 3张三,25,北京 4李四,30,上海 5 6参数设置: 7format:csv_with_names 8结果:系统自动跳过首行列名
-
使用 csv_with_names_and_types 格式:
Plain Text1数据文件: 2name,age,city 3string,int,string 4张三,25,北京 5李四,30,上海 6 7参数设置: 8format:csv_with_names_and_types 9结果:系统自动跳过前两行的列名和类型信息
-
裁剪双引号
- 作用:裁剪掉 CSV 文件每个字段最外层的双引号
- 类型:布尔类型
- 默认值:false
-
使用场景和示例:
-
裁剪双引号:
Plain Text1数据文件: 2"张三","25","北京" 3"李四","30","上海" 4 5参数设置: 6trim_double_quotes:true 7结果: 8张三,25,北京 9李四,30,上海
-
压缩格式
- 作用:指定导入文件的压缩格式
- 类型:字符串,忽略大小写
- 默认值:plain
-
支持的压缩格式:
- plain:不压缩(默认)
- bz2:BZIP2 压缩
- deflate:DEFLATE 压缩
- gz:GZIP 压缩
- lz4:LZ4 Frame 格式压缩
- lz4_block:LZ4 Block 格式压缩
- lzo:LZO 压缩
- lzop:LZOP 压缩
- snappy_block:SNAPPY Block 格式压缩
-
注意事项:
- tar 是一种文件打包格式,不属于压缩格式,因此不支持 .tar 文件
- 如需使用 tar 打包的文件,请先解包后再导入
使用示例
本节展示了不同导入方式下的 CSV 格式使用方法。
Stream Load 导入
Shell
1# 指定分隔符
2curl --location-trusted -u root: \
3 -H "column_separator:," \
4 -H "line_delimiter:\n" \
5 -T example.csv \
6 http://<fe_host>:<fe_http_port>/api/test_db/test_table/_stream_load
7
8# 处理带引号的数据
9curl --location-trusted -u root: \
10 -H "column_separator:," \
11 -H "enclose:\"" \
12 -H "escape:\\" \
13 -T example.csv \
14 http://<fe_host>:<fe_http_port>/api/test_db/test_table/_stream_load
15
16# 导入压缩文件
17curl --location-trusted -u root: \
18 -H "compress_type:gz" \
19 -T example.csv.gz \
20 http://<fe_host>:<fe_http_port>/api/test_db/test_table/_stream_load
Broker Load 导入
SQL
1-- 指定分隔符
2LOAD LABEL test_db.test_label
3(
4 DATA INFILE("s3://bucket/example.csv")
5 INTO TABLE test_table
6 COLUMNS TERMINATED BY ","
7 LINES TERMINATED BY "\n"
8)
9WITH S3
10(
11 ...
12);
13
14-- 处理带引号的数据
15LOAD LABEL test_db.test_label
16(
17 DATA INFILE("s3://bucket/example.csv")
18 INTO TABLE test_table
19 PROPERTIES
20 (
21 "enclose" = "\"",
22 "escape" = "\\"
23 )
24)
25WITH S3
26(
27 ...
28);
29
30-- 导入压缩文件
31LOAD LABEL test_db.test_label
32(
33 DATA INFILE("s3://bucket/example.csv.gz")
34 INTO TABLE test_table
35 PROPERTIES
36 (
37 "compress_type" = "gz"
38 )
39)
40WITH S3
41(
42 ...
43);
Routine Load 导入
SQL
1-- 指定分隔符
2CREATE ROUTINE LOAD test_db.test_job ON test_table
3COLUMNS TERMINATED BY ","
4FROM KAFKA
5(
6 ...
7);
8
9-- 处理带引号的数据
10CREATE ROUTINE LOAD test_db.test_job ON test_table
11COLUMNS TERMINATED BY ","
12PROPERTIES
13(
14 "enclose" = "\"",
15 "escape" = "\\"
16)
17FROM KAFKA
18(
19 ...
20);
MySQL Load 导入
SQL
1-- 指定分隔符
2LOAD DATA LOCAL INFILE 'example.csv'
3INTO TABLE test_table
4COLUMNS TERMINATED BY ','
5LINES TERMINATED BY '\n';
6
7-- 处理带引号的数据
8LOAD DATA LOCAL INFILE 'example.csv'
9INTO TABLE test_table
10COLUMNS TERMINATED BY ','
11LINES TERMINATED BY '\n'
12PROPERTIES
13(
14 "enclose" = "\"",
15 "escape" = "\\"
16);
17
18-- 跳过表头
19LOAD DATA LOCAL INFILE 'example.csv'
20INTO TABLE test_table
21COLUMNS TERMINATED BY ','
22LINES TERMINATED BY '\n'
23IGNORE 1 LINES;
TVF 导入
SQL
1-- 指定分隔符
2INSERT INTO test_table
3SELECT *
4FROM S3
5(
6 "uri" = "s3://bucket/example.csv",
7 "format" = "csv",
8 "column_separator" = ",",
9 "line_delimiter" = "\n"
10 ...
11);
12
13-- 处理带引号的数据
14INSERT INTO test_table
15SELECT *
16FROM S3
17(
18 "uri" = "s3://bucket/example.csv",
19 "format" = "csv",
20 "column_separator" = ",",
21 "enclose" = "\"",
22 "escape" = "\\"
23 ...
24);
25
26-- 导入压缩文件
27INSERT INTO test_table
28SELECT *
29FROM S3
30(
31 "uri" = "s3://bucket/example.csv.gz",
32 "format" = "csv",
33 "compress_type" = "gz"
34 ...
35);