GreenPlum数据通过外部表及gpfdist工具卸载数据
上一篇文章介绍如何使用外部表的方式来加载数据,本文来介绍下如何使用外部表的方式来卸载数据。加载数据使用的是只读外部表,卸载数据使用的是可写外部表。
之前也有文章介绍了通过copy命令来卸载数据,copy命令卸载数据时,数据由Segment节点读取到Master节点,再有Master节点汇总,然后写入到外部文件中,这种方式不能使用并行,而且所有数据都要经过Master节点,效率相对低下,但是如果数据量很小的情况下,copy命令卸载数据就很方便。
使用可写外部表卸载数据时,如果使用gpfdist工具,就可以实现并行卸载,而且数据不需要经过Master节点,直接由Segment节点写入到外部文件中,效率比较高,卸载大量数据时,使用这种方式会节省大量的时间。下面测试通过可写外部表并且使用gpfdist工具来卸载数据。
启动gpfdist工具。
[gpadmin@mdw ~]$ nohup gpfdist –d /home/gpadmin –p 1234 >/tmp/gpfdist.log & [1] 10552
创建可写外部表。
dbdream=# create writable external table med_ord_pgm_d_unload (like med_ord_pgm_d) location ('gpfdist://sdw1:1234/home/gpadmin/unload.txt') Format 'text'; NOTICE: Table doesn't have 'distributed by' clause, defaulting to distribution columns from LIKE table CREATE EXTERNAL TABLE
可写外部表可以指定分布键,如果不指定,默认使用随机分布。为了测试外部表卸载和加载时,gpfdist工具的用法不同,上面的SQL在外部表文件部分使用的是绝对路径(/home/gpadmin/unload.txt),如果看过上一篇介绍外部表加载数据的文章,会发现,外部表加载时,使用绝对路径是可以的,可是在卸载数据时,是不可以使用绝对路径的,卸载时会遇到下面的错误。
dbdream=# insert into med_ord_pgm_d_unload select * from med_ord_pgm_d; ERROR: http response code 404 from gpfdist (gpfdist://sdw1:1234/home/gpadmin/unload.txt): HTTP/1.0 404 file open failure /home/gpadmin/home/gpadmin/unload.txt: No such file or directory (url.c:352) (seg1 sdw2:40000 pid=4615) (cdbdisp.c:1326)
从上面的错误可以看出,文件写到了/home/gpadmin/home/gpadmin/unload.txt而不是/home/gpadmin/unload.txt,这是因为启动gpfdist工具时,指定了文件扫描路径是/home/gpadmin,所以在建表时,需要将这个路径去掉(如果卸载的数据报存到/home/gpadmin/unload/unload.txt,这里只需要写/unload/unload.txt即可)。
dbdream=# drop external table med_ord_pgm_d_unload; DROP EXTERNAL TABLE dbdream=# create writable external table med_ord_pgm_d_unload (like med_ord_pgm_d) location ('gpfdist://sdw1:1234/unload.txt') Format 'text'; NOTICE: Table doesn't have 'distributed by' clause, defaulting to distribution columns from LIKE table CREATE EXTERNAL TABLE dbdream=# insert into med_ord_pgm_d_unload select * from med_ord_pgm_d; INSERT 0 1000000
在使用gpfdist工具创建外部表时,文件地址中使用的端口号是gpfdist启动时指定的端口号,而不是Segment节点的监听端口号,如果端口号写错,数据卸载时会遇到下面的错误。
dbdream=# insert into med_ord_pgm_d_unload select * from med_ord_pgm_d; WARNING: http://10.9.15.24:40000/home/gpadmin/unload.txt error (52 - Server returned nothing (no headers, no data)) (seg2 sdw3:40000 pid=12332) WARNING: http://10.9.15.24:40000/home/gpadmin/unload.txt error (52 - Server returned nothing (no headers, no data)) (seg0 sdw1:40000 pid=5220) WARNING: failed to send request to gpfdist (http://10.9.15.24:40000/home/gpadmin/unload.txt), will retry after 1 seconds (seg0 sdw1:40000 pid=5220) WARNING: http://10.9.15.24:40000/home/gpadmin/unload.txt error (52 - Server returned nothing (no headers, no data)) (seg1 sdw2:40000 pid=4615)
可写外部表,仅支持数据写入操作,并不支持数据的更改和删除操作。
dbdream=# delete from med_ord_pgm_d_unload; ERROR: cannot update or delete from external relation “med_ord_pgm_d_unload”
当然,也不能对外部表进行truncate操作,如果卸载数据时出错,只能删除外部表的外部文件,再重新卸载。
dbdream=# truncate table med_ord_pgm_d_unload; ERROR: “med_ord_pgm_d_unload” is an external relation and can’t be truncate