加载时源文件与被加载表列出现不匹配问题,如何操作?

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)

添加新评论