Greenplum常見建立表方式與說明
1 建立Heap表
drop table if exists test_head; create table test_head(id int primary key) distributed by (id);
distributed by 表示制定分佈鍵,便於segment儲存資料
2 建立AO表
2.1 AO表不壓縮
drop table if exists test_ao; create table test_ao(id int) with (appendonly=true) distributed by (id);
appendonly=true是表示AO(Append-optimized)儲存表的表示,引數為true和false,例如appendonly=true或appendonly=false
2.2 AO表壓縮
drop table if exists test_ao; create table test_ao(id int) with (appendonly=true, compresslevel=5) distributed by (id);
compresslevel是壓縮率,取值為1~9,一般選擇5就足夠了,值越高壓縮率越高
2.3 AO表列存壓縮 與上表的壓縮方式不同
drop table if exists test_ao; create table test_ao(id int) with (appendonly=true,compresslevel=5, orientation=column) distributed by (id);
orientation是對列進行壓縮,寫法只有orientation=column
2.3.1 對orientation引數進行測試
2.3.1.1 建立表語句
建立不對列壓縮的表
CREATE TABLE **********_20180810( ******** ) WITH (appendonly=true, compresstype=zlib, compresslevel=5) DISTRIBUTED BY (pripid);
建立對列壓縮的表
CREATE TABLE ********_20180812( ********* ) WITH (appendonly=true, compresstype=zlib, compresslevel=5,orientation=column) DISTRIBUTED BY (pripid);
一共15個欄位
2.3.1.2 檢視資料的大小
$ du -sh *******_20180922.csv 48G ********_20180922.csv
2.3.1.3 使用COPY命令匯入資料
$ time psql -d stagging -h 192.****.11 -p 5432 -U gpadmin -c "\COPY *******_20180810 FROM '/data/oracle-export-data/DATA20180922/*******_20180922.csv' WITH csv DELIMITER E'\001' LOG ERRORS SEGMENT REJECT LIMIT 3000 ROWS" Password for user gpadmin:
real 11m49.978s user 1m17.379s sys 0m43.668s
time psql -d stagging -h 192.****.11 -p 5432 -U gpadmin -c "\COPY *******_20180812 FROM '/data/oracle-export-data/DATA20180922/*******_20180922.csv' WITH csv DELIMITER E'\001' LOG ERRORS SEGMENT REJECT LIMIT 3000 ROWS" Password for user gpadmin:
real 12m11.227s user 1m27.575s sys 0m50.548s
在以上結果中可以看出不對列壓縮用時11m49.978s,而對列壓縮的用時12m11.227s,相差23S
2.3.1.4 檢視在資料庫中佔用的大小
select pg_size_pretty(pg_relation_size('*******_20180810')); -- 14 GB
select pg_size_pretty(pg_relation_size('*******_20180812')); -- 11 GB
使用列壓縮竟然縮小了3G的空間,好恐怖,23S節省3G空間,值得擁有。
2.3.1.5 查看錶的行數
select count(*) from *******_20180810; -- 156784862
select count(*) from *******_20180812; -- 156784862
3 建立HDFS外表例項
3.1 建立外部表例項
CREATE EXTERNAL TABLE *******_20180812( ****************
) LOCATION ('gphdfs://nameservice1/tmp/******_20180812/******/*') format 'text' (delimiter E'\u0001' FILL MISSING FIELDS) LOG ERRORS SEGMENT REJECT LIMIT 3000 ROWS;
EXTERNAL外表需要新增關鍵字
nameservice1是HDFS的HA的地址,需要先配置好
tmp/******_20180812/*******/是HDFS上的路徑
delimiter分隔符是 E'\u0001',也就是隱藏符SOH
LOG ERRORS SEGMENT REJECT說明吧錯誤資料放到GP預設的gp_read_error_log中
LIMIT 3000 ROWS 表示允許錯誤的最大的錯誤數,可以調大也可以調小,最小為1
3.2 檢視錯誤資料的例項
SELECT gp_read_error_log('tableName');
錯誤表字段解釋:
Column | Type | Modifiers ----------+--------------------------+----------- cmdtime | timestamp with time zone | --操作時間 relname | text | --表名 filename | text | --檔名 linenum | integer | --錯誤行號 bytenum | integer | errmsg | text | --錯誤資訊 rawdata | text | --整行資料 rawbytes | bytea | --行大小 Distributed randomly
4 快速複製表
CREATE TABLE ********_20180814 WITH ( appendonly = TRUE, compresstype = zlib, compresslevel = 5, orientation = column ) AS SELECT * FROM **********_20180812 Distributed BY (pripid)
檢視執行的執行的時間
**************
FROM ********_20180812 Distributed BY (pripid)
時間: 69.977s
受影響的行: 1,5678,4862
可以看出用時 69.977s匯入1,5678,4862行的資料