不同
问题现象
如下用例中,使用format 3 正常加载,使用format 5 报错。
create table t1(a int,b timestamp NOT NULL DEFAULT CURRENT_TIMES
TAMP ON UPDATE CURRENT_TIMESTAMP);
# more t1.txt
1,
2,
3,
gbase> LOAD DATA INFILE 'ftp://root:111111@192.168.1.4//opt/t1.txt' I
NTO TABLE test.t1
data_format 3 FIELDS TERMINATED BY ',' TA
BLE_FIELDS 'a' ;
Query OK, 3 rows affected (Elapsed: 00:00:00.08)
Task 262179 finished, Loaded 3 records, Skipped 0 records
gbase> LOAD DATA INFILE 'ftp://root:111111@192.168.1.4//opt/t1.txt' I
NTO TABLE test.t1
data_format 5 FIELDS TERMINATED BY ',' TA
BLE_FIELDS 'a' ;
Query OK, 0 rows affected (Elapsed: 00:00:00.10)
Task 262180 finished, Loaded 0 records, Skipped 3 records
GBase 8a MPP Cluster 最佳实践
5 FAQ
文档版本(2022-02-11)
南大通用数据技术股份有限公司
126
# more 262180_test_t1_n1_192.168.1.4_20180516203143.trc
file_name
|
file_offset
|
record_len
|
column
|
reason
ftp://root:******@192.168.1.4//opt/t1.txt|0|3|2|validate error
ftp://root:******@192.168.1.4//opt/t1.txt|3|3|2|validate error
ftp://root:******@192.168.1.4//opt/t1.txt|6|3|2|validate error
原因分析
这是format 取值为5 和3 对于空值处理不一致的规则决定的,是符合预期的。
数据文件中timestamp 列数据为空。
按照规则,
format 5 对于空值入库数据为null。
但timestamp 有not null 约束,所以不能入库。fortmat 3 对于空值的处理是先取
default 值,所以行为不一样。
即format 取值为5 数据中有空值时,
入库数据为null,
不是default 值,
设定default
值对加载结果没有影响。format 取值为3 数据中有空值时,如果有default 值,入
库数据为default 值,否则入库为null。
宽松模式处理规则与文本方式加载处理规则不一致的有:
行分隔符、列分隔符、包围符仅支持单字符(单字节),指定多字符报错;
数据中有空值时,入库数据为null,不是default 值,设定default 值对加载结
果没有影响;
支持超宽列自动截断;
数据文件的包围符、列分隔符与设置的不一致,如果第一列为字符型,数据
截断入库,后面的字段都为空值;如果第一列为数值型,则都为错误数据;
指定auto_fill_column,在少列的时候自动补齐,无论列定义是否有default
值,都会用null 值补齐缺失列,而不是default 值。