当前位置: 首页 > GreenPlum > 正文

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

 

本文固定链接: http://www.dbdream.com.cn/2016/02/greenplum%e6%95%b0%e6%8d%ae%e9%80%9a%e8%bf%87%e5%a4%96%e9%83%a8%e8%a1%a8%e5%8f%8agpfdist%e5%b7%a5%e5%85%b7%e5%8d%b8%e8%bd%bd%e6%95%b0%e6%8d%ae/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2016年02月03日发表在 GreenPlum 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: GreenPlum数据通过外部表及gpfdist工具卸载数据 | 信春哥,系统稳,闭眼上线不回滚!
关键字: , ,

GreenPlum数据通过外部表及gpfdist工具卸载数据:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter