greenplum 提供了快速導入資料的方法,下面通過一個例子示範給大家.
我們用tpch測試中最大的表做導入測試
首先簡單介紹下原理.
1) greenplum 通過外部表的方式讓所有 segment 同時連接配接到一組外部服務 gpfdist, 同時拉取資料
2) gpfdist 随機分發資料給所有 segment.
3) segment拿到資料後先解析它,根據表的分發規則收下屬于自己的資料,把不屬于自己的資料再分發給所屬的segment.
整個過程充分利用了網絡和各 segment 的硬體資源,效率極高.
demo:
1) 在檔案伺服器上啟動gpfdist服務,端口号8080,指定文本檔案所在目錄
./gpfdist -d /u01/gp001/dss-data/ -p 8080 -l /u01/gp001/loadlog.log
2) 連接配接greenplum master節點,建立外部表
create external table lineitem_load (
l_orderkey integer ,
l_partkey integer ,
l_suppkey integer ,
l_linenumber integer,
l_quantity decimal,
l_extendedprice decimal,
l_discount decimal,
l_tax decimal,
l_returnflag char(1),
l_linestatus char(1),
l_shipdate date,
l_commitdate date,
l_receiptdate date,
l_shipinstruct char(25),
l_shipmode char(10),
l_comment varchar(44)
) location ('gpfdist://1192.168.1.1:8080/lineitem.csv')
format 'csv' (delimiter '|');
關鍵資訊:
1. 指定了外部資料源是剛才啟動的gpfdist服務,并指定了需要導入的文本檔案名
2 文本的根式是csv,列之間用 | 分隔.
3) 按照需求建立表,資料會導入到這個表中
create table lineitem (
l_orderkey ,
l_partkey ,
l_suppkey ,
l_linenumber integer,
l_quantity decimal,
l_extendedprice decimal,
l_discount decimal,
l_tax decimal,
l_returnflag char(1),
l_linestatus char(1),
l_shipdate date,
l_commitdate date,
l_receiptdate date,
l_shipinstruct char(25),
l_shipmode char(10),
l_comment varchar(44)
) with (oids=false) distributed by (l_orderkey, l_linenumber);
4) 通過外部資料源把資料導入到 greenplum 中
insert into lineitem select * from lineitem_load;
5) 通過執行計劃,可以了解他是工作原理, 整個過程 master 節點不會處理資料,都由 segment完成.
explain insert into lineitem select * from lineitem_load;
query plan
-----------------------------------------------------------------------------------------------------
insert (slice0; segments: 16) (rows=62500 width=426)
-> redistribute motion 16:16 (slice1; segments: 16) (cost=0.00..18500.00 rows=62500 width=426)
hash key: l_orderkey, lineitem_load.l_linenumber
-> external scan on lineitem_load (cost=0.00..18500.00 rows=62500 width=426)
settings: effective_cache_size=1gb
(5 rows)