支持的导入方式
•BROKER LOAD
LOAD LABEL example_db.label1(DATA INFILE("bos://bucket/input/file")INTO TABLE `my_table`(k1, k2, tmpk3)PRECEDING FILTER k1 = 1SET (k3 = tmpk3 + 1)WHERE k1 > k2)WITH BROKER bos(...);
•STREAM LOAD
curl--location-trusted-u user:passwd-H "columns: k1, k2, tmpk3, k3 = tmpk3 + 1"-H "where: k1 > k2"-T file.txthttp://host:port/api/testDb/testTbl/_stream_load
CREATE ROUTINE LOAD example_db.label1 ON my_tableCOLUMNS(k1, k2, tmpk3, k3 = tmpk3 + 1),PRECEDING FILTER k1 = 1,WHERE k1 > k2...
以上导入方式都支持对源数据进行列映射、转换和过滤操作:
•前置过滤:对读取到的原始数据进行一次过滤。
PRECEDING FILTER k1 = 1
•映射:定义源数据中的列。如果定义的列名和表中的列相同,则直接映射为表中的列。如果不同,则这个被定义的列可以用于之后的转换操作。如上面示例中的:
(k1, k2, tmpk3)
•转换:将第一步中经过映射的列进行转换,可以使用内置表达式、函数、自定义函数进行转化,并重新映射到表中对应的列上。如上面示例中的:
k3 = tmpk3 + 1
•后置过滤:对经过映射和转换后的列,通过表达式进行过滤。被过滤的数据行不会导入到系统中。如上面示例中的:
WHERE k1 > k2
列映射
列映射的目的主要是描述导入文件中各个列的信息,相当于为源数据中的列定义名称。通过描述列映射关系,我们可以将于表中列顺序不同、列数量不同的源文件导入到 Doris 中。下面我们通过示例说明:
假设源文件有4列,内容如下(表头列名仅为方便表述,实际并无表头):
列1 | 列2 | 列3 | 列4 |
1 | 100 | beijing | 1.1 |
2 | 200 | shanghai | 1.2 |
3 | 300 | guangzhou | 1.3 |
4 | \N | chongqing | 1.4 |
注:\N 在源文件中表示 null。
调整映射顺序
假设表中有 k1,k2,k3,k4 4列。我们希望的导入映射关系如下:
列2 -> k3
列3 -> k2
列4 -> k4
源文件中的列数量多于表中的列
列2 -> k3
列3 -> k2
源文件中的列数量少于表中的列,使用默认值填充
列2 -> k3
列3 -> k2
列前置过滤
前置过滤是对读取到的原始数据进行一次过滤。目前仅支持 BROKER LOAD 和 ROUTINE LOAD。
前置过滤有以下应用场景:
转换前做过滤
过滤列不存在于表中,仅作为过滤标识
列转换
列转换功能允许用户对源文件中列值进行变换。目前 Doris 支持使用绝大部分内置函数、用户自定义函数进行转换。
注:自定义函数隶属于某一数据库下,在使用自定义函数进行转换时,需要用户对这个数据库有读权限。
转换操作通常是和列映射一起定义的。即先对列进行映射,再进行转换。下面我们通过示例说明:
假设源文件有4列,内容如下(表头列名仅为方便表述,实际并无表头):
列1 | 列2 | 列3 | 列4 |
1 | 100 | beijing | 1.1 |
2 | 200 | shanghai | 1.2 |
3 | 300 | guangzhou | 1.3 |
\N | 400 | chongqing | 1.4 |
将源文件中的列值经转换后导入表中
列2 * 100 -> k3
列3 -> k2
列4 -> k4
k1 | k2 | k3 | k4 |
1 | beijing | 10000 | 1.1 |
2 | shanghai | 20000 | 1.2 |
3 | guangzhou | 30000 | 1.3 |
null | chongqing | 40000 | 1.4 |
通过 case when 函数,有条件的进行列转换。
列2 -> k2
列3 进行地区id转换后 -> k3
列4 -> k4
k1 | k2 | k3 | k4 |
1 | 100 | 1 | 1.1 |
2 | 200 | 2 | 1.2 |
3 | 300 | 3 | 1.3 |
null | 400 | 4 | 1.4 |
将源文件中的 null 值转换成 0 导入。同时也进行示例2中的地区id转换。
列2 -> k2
列3 -> k3
列4 -> k4
k1 | k2 | k3 | k4 |
1 | 100 | 1 | 1.1 |
2 | 200 | 2 | 1.2 |
3 | 300 | 3 | 1.3 |
0 | 400 | 4 | 1.4 |
列过滤
经过列映射和转换后,我们可以通过过滤条件将不希望导入到Doris中的数据进行过滤。下面我们通过示例说明:
假设源文件有4列,内容如下(表头列名仅为方便表述,实际并无表头):
列1 | 列2 | 列3 | 列4 |
1 | 100 | beijing | 1.1 |
2 | 200 | shanghai | 1.2 |
3 | 300 | guangzhou | 1.3 |
\N | 400 | chongqing | 1.4 |
在列映射和转换缺省的情况下,直接过滤
k1 | k2 | k3 | k4 |
3 | 300 | guangzhou | 1.3 |
null | 400 | chongqing | 1.4 |
对经过列转换的数据进行过滤
where k3 != 3
k1 | k2 | k3 | k4 |
1 | 100 | 1 | 1.1 |
2 | 200 | 2 | 1.2 |
null | 400 | 4 | 1.4 |
多条件过滤
k1 | k2 | k3 | k4 |
2 | 200 | 2 | 1.2 |
3 | 300 | 3 | 1.3 |
数据质量问题和过滤阈值
导入作业中被处理的数据行可以分为如下三种:
Filtered Rows
Unselected Rows
Loaded Rows
Doris 的导入任务允许用户设置最大错误率(max_filter_ratio)。如果导入的数据的错误率低于阈值,则这些错误行将被忽略,其他正确的数据将被导入。
错误率的计算方式为:
#Filtered Rows (#Filtered Rows + #Loaded Rows)
也就是说 Unselected Rows 不会参与错误率的计算。
更多大数据相关内容请关注大数据技能圈公众号:




