加载时源文件与被加载表列出现不匹配问题,如何操作?
warning:
这篇文章距离上次修改已过1628天,其中的内容可能已经有所变动。
此问题的关键在于加载控制文件ctl的编写,针对不同情况修改table_fields的内容。
table_fields中罗列的列名必须与数据文件的列顺序一致。
1、如果数据文件列少,数据表列多,则多出的列必须允许为空,在table_fields中不需要罗列该列名;
2、如果数据文件列多,数据表列少,则文件中多出的列在table_fields中列名后加filler;
3、如果数据文件列顺序与数据表列顺序不同,则table_fields中罗列的列必须顺序上对应数据文件。
举例如下:
原始数据文件:
1,2,3,4
1,2,3,4
1,2,3,4
(1)文件中字段少于表定义的情况
加载数据文件全部列到表gt1的a,b,c,d列。
建表语句:
建表语句:
create table gt1 (a int ,b int ,c int ,d int ,e int);
加载控制文件:
[ceshi]
disp_server=192.168.105.211:6666
file_list=/opt/gtest/test.tbl
format=3
null_value='null'
delimiter=','
db_user=gbase
db_name=test
table_name=gt1
hash_parallel=1
table_fields='a,b,c,d'
加载后结果:
gbase> select * from gt1;
+------+------+------+------+------+
| a | b | c | d | e |
+------+------+------+------+------+
| 1 | 2 | 3 | 4 | NULL |
| 1 | 2 | 3 | 4 | NULL |
| 1 | 2 | 3 | 4 | NULL |
+------+------+------+------+------+
3 rows in set (Elapsed: 00:00:00.01)
(2)文件中字段多于表定义的情况:
加载数据文件前3列到表gt2的a,b,c列。
建表语句:
建表语句:
create table gt2 (a int ,b int ,c int );
加载控制文件:
[ceshi]
disp_server=192.168.105.211:6666
file_list=/opt/gtest/test.tbl
format=3
null_value='null'
delimiter=','
db_user=gbase
db_name=test
table_name=gt2
hash_parallel=1
table_fields='a,b,c,1 filler'
加载后结果:
gbase> select * from gt2;
+------+------+------+
| a | b | c |
+------+------+------+
| 1 | 2 | 3 |
| 1 | 2 | 3 |
| 1 | 2 | 3 |
+------+------+------+
3 rows in set (Elapsed: 00:00:00.00)
(3)文件中字段多于表定义的情况:
加载数据文件的第4,2列到表gt3的a,b列。
建表语句:
建表语句:
create table gt3 (a int ,b int );
加载控制文件:
[ceshi]
disp_server=192.168.105.211:6666
file_list=/opt/gtest/test.tbl
format=3
null_value='null'
delimiter=','
db_user=gbase
db_name=test
table_name=gt3
hash_parallel=1
table_fields='1 filler,b,2 filler,a'
加载后结果:
gbase> select * from gt3;
+------+------+
| a | b |
+------+------+
| 4 | 2 |
| 4 | 2 |
| 4 | 2 |
+------+------+
3 rows in set (Elapsed: 00:00:00.00)