Greenplum的外部表和ORACLE的外部表同樣,都是數據存儲在數據庫以外的表。它的外部表除了能夠加載本地的數據,還能夠經過gpfdist工具並行加載數據。因爲本地方式加載的效率低,已經被gpfdist取代。本文先介紹本地方式加載,後介紹gpfdist方式。html
rhnschema=# CREATE EXTERNAL TABLE ext_rhn1 (package_id numeric, primary_xml bytea, filelist bytea, other bytea, created timestamp(6) with time zone, modified timestamp(6) with time zone) LOCATION ('file://pg03:5432/u01/rhnpackagerepodata.csv') FORMAT 'CSV';
注意:
一、數據文件必須位於segment節點;
二、主機名後面的端口號隨便寫,也能夠不寫;
三、若是文件有頭部信息,則在format後面跟上(HEADER)參數;
四、file後面必須使用主機名,使用IP建立外部表能夠成功,可是查詢時會報錯。
具體的建立外部表的語法能夠參考官方手冊。sql
在裝載以前,打開時間記錄器,統計下整個加載過程耗時多久。
數據分佈狀況以下圖所示:
數據分佈相對來說很是均勻,GreenPlum數據庫是自動提交,不須要觸發commit命令進行提交(Greenplum下想要回滾操做,比較麻煩,因此儘可能不要在GreenPlum數據庫作DML測試性的操做)。數據庫
gpfdist能夠實現並行加載,須要先啓動gpfdist進程及監聽端口,這個命令在Master和Segment節點的GPHOME/bin目錄下,若是配置了GP的環境變量,能夠直接使用,若是在沒有安裝GP的服務器上使用gpfdist工具,只須要將gpfdist命令的文件拷貝到相應的服務器上便可使用。服務器
[gpadmin@pg01 ~]$ gpfdist -d /u01 -p 5555 -l /tmp/gpfdist.log & [gpadmin@pg01 ~]$ more /tmp/gpfdist.log 2019-06-19 14:20:24 16560 INFO Before opening listening sockets - following listening sockets are available: 2019-06-19 14:20:24 16560 INFO IPV6 socket: [::]:5555 2019-06-19 14:20:24 16560 INFO IPV4 socket: 0.0.0.0:5555 2019-06-19 14:20:24 16560 INFO Trying to open listening socket: 2019-06-19 14:20:24 16560 INFO IPV6 socket: [::]:5555 2019-06-19 14:20:24 16560 INFO Opening listening socket succeeded 2019-06-19 14:20:24 16560 INFO Trying to open listening socket: 2019-06-19 14:20:24 16560 INFO IPV4 socket: 0.0.0.0:5555 Serving HTTP on port 5555, directory /u01
rhnschema=# CREATE EXTERNAL TABLE ext_rhn2 (package_id numeric, primary_xml bytea, filelist bytea, other bytea, created timestamp(6) with time zone, modified timestamp(6) with time zone) LOCATION ('gpfdist://pg01:5555/rhnpackagerepodata.csv') FORMAT 'CSV'; CREATE EXTERNAL TABLE
在gpfdist下,便可以使用主機名,也可使用IP。後面的文件路徑不能使用絕對路徑,由於gpfdist啓動時候指定了掃描路徑爲/u01。
當查詢外部表的總記錄數時,報以下錯誤:socket
rhnschema=# select count(*) from ext_rhn2; ERROR: gpfdist error - line too long in file /u01/rhnpackagerepodata.csv near (148241 bytes) (seg2 slice1 192.168.120.19:40000 pid=20990) DETAIL: External table ext_rhn2, line 3 of gpfdist://pg01:5555/rhnpackagerepodata.csv: ""
出現此錯誤,使用-m參數從新啓動,以下:ide
[gpadmin@pg01 ~]$ kill -9 `ps -ef|grep gpfdist|grep -v grep|awk '{print $2}'` [gpadmin@pg01 ~]$ gpfdist -d /u01 -m 268435456 -p 5555 -l /tmp/gpfdist.log &
-m參數的值默認是32K,最大爲256M,這裏設置爲最大268435456 bytes(256M)。再次查詢正常,以下圖:
工具
使用gpfdist測試下裝載速度,以下:
經過測試能夠看到,使用本地文件的方式加載,須要102399ms,而使用gpfdist工具加載數據,須要57361ms。若是測試數據更多,加載的文件更大,速度還會更加明顯。
數據分佈狀況以下圖所示:
數據分佈狀況和本地文件方式加載的分佈狀況同樣。另外GreenPlum數據庫查詢數據,先掃描到的數據會直接返回,也就是屢次查詢的結果多是不同的,可是使用gpfdist工具加載,查詢結果基本不會是像本地文件加載那樣直接從第一條開始有序返回,由於本地加載沒有使用並行,在加載的時候數據是從第一條開始有序插入的,而gpfdist工具加載數據是並行加載的,最早插入到數據庫的數據並不必定是從第一條數據開始的。測試
使用可寫外部表卸載數據時,若是使用gpfdist工具,就能夠實現並行卸載,並且數據不須要通過Master節點,直接由Segment節點寫入到外部文件中,效率比較高,卸載大量數據時,使用這種方式會節省大量的時間。
使用下面的命令建立可寫外部表:ui
rhnschema=# CREATE WRITABLE EXTERNAL TABLE unload_ext_rhn (package_id numeric, primary_xml bytea, filelist bytea, other bytea, created timestamp(6) with time zone, modified timestamp(6) with time zone) LOCATION ('gpfdist://pg01:5555/unload_rhnpackagerepodata.csv') FORMAT 'CSV'; CREATE EXTERNAL TABLE
因爲gpfdist啓動過程當中,指定了掃描路徑爲/u01,因此上述gpfdist後面不能跟絕對路徑,不然會報錯。
卸載數據以下:3d
rhnschema=# insert into unload_ext_rhn select *from rhnpackagerepodata; INSERT 0 77810
可寫外部表,僅支持數據寫入操做,並不支持數據的更改和刪除操做。也不支持對錶進行truncate操做。若是卸載數據時出錯,只能刪除外部表的外部文件,再從新卸載。