装载和卸载数据
GP装载概述
关于外部表
WEB:访问动态数据源(比如wen服务或者OS的命令或脚本)
关于gpload
2) 需要创建一个按照YAML格式定义的装载说明控制文件
关于copy
2) 不具有并行装载/卸载的机制
定义外部表
概述
在创建外部表定义时,必须指定文件格式和文件位置;三种用来访问外部表数据源的协议:gpfdist, gpfdists和gphdfs。
gpfdist
5) 可使用通配符或者C风格的模式匹配多个文件
gpfdists
1) gpfdists是gpfdist的安全版本,其开启的加密通信并确保文件与GP之间的安全认证
file
4) pg_max_external_files用来确定每个外部表中允许多少个外部文件
gphdfs
4) 对于写来说,每个GP Segment实例值写该实例包含的数据
外部文件格式
3) 自定义格式适用于gphdfs
外部表中的错误数据
为了在装载正确格式的记录时隔离错误数据,需在定义外部表时使用单条记录出错处理
外部表备份恢复
在备份或者恢复操作中,仅仅外部表或者WEB外部表的定义会被备份或恢复。
使用GP并行文件服务(gpfdist)
b) 在后台启动gpfdist(日志信息和出错信息输出到日志文件)
- 1
c) 要在同一个ETL主机启动多个gpfdist服务,为每个服务指定不同的目录和端口。例如,
- 1
- 2
第一步找到进程号,
- 1
第二步杀掉该进程
$ select pg_cancel_backend(1234);
- 1
b) 使用wget命令来测试GP集群的连接性
$ wget http://gpfdist_hostname:port/filename
- 1
a) 创建单文件服务的可读外部表,文件格式为竖线(|)分割:
CREATE EXTERNAL TABLE tb_ext_gf01(id int, name text) LOCATION (‘gpfdist://mdw:8081/*.txt’) FORMAT ‘TEXT’ (DELIMITER ‘|’ NULL ‘’);
- 1
- 2
- 3
b) 创建多文件服务的可读外部表,文件格式为竖线(|)分割:
CREATE EXTERNAL TABLE tb_ext_gf02(id int, name text) LOCATION ('gpfdist://mdw:8081/*.txt','gpfdist://mdw:8082/*.txt') FORMAT 'TEXT' (DELIMITER '|' NULL '');
- 1
- 2
- 3
c) 带有错误数据日志的多文件服务
CREATE EXTERNAL TABLE tb_ext_gf03 ( id int, name text, amount float4) LOCATION ('gpfdist://mdw:8081/*.csv','gpfdist://mdw:8082/*.csv') FORMAT 'CSV' ( DELIMITER ',' ) LOG ERRORS INTO err_customer SEGMENT REJECT LIMIT 2;
- 1
- 2
- 3
- 4
d) 创建可写外部表
CREATE WRITABLE EXTERNAL TABLE tb_ext_gf04 (LIKE tb_cp_02) LOCATION ('gpfdist://mdw:8081/tb_cp_02.out') FORMAT 'TEXT' ( DELIMITER '|' NULL ' ') DISTRIBUTED BY (id); insert into tb_ext_gf04 select * from tb_cp_02;
- 1
- 2
- 3
- 4
- 5
装载全部数据到一个新的数据表
CREATE TABLE tb_load_01 AS SELECT * FROM tb_ext_gf01;
- 1
- 2
使用Hadoop分布式文件系统表
c) 在外部表定义中指定HDFS数据
创建和使用WEB外部表
例如:
CREATE EXTERNAL WEB TABLE tb_ext_wb01(output text) EXECUTE 'hostname' FORMAT 'TEXT';
- 1
- 2
- 3
5) 定义URL型WEB外部表
CREATE EXTERNAL WEB TABLE tb_ext_wb02 (name text, date date, amount float4, category text, description text) LOCATION ( 'http://intranet.company.com/expenses/marketing/file.csv', 'http://intranet.company.com/expenses/eng/file.csv‘ ) FORMAT 'CSV' ( HEADER );
- 1
- 2
- 3
- 4
- 5
- 6
- 7
装载和卸载数据
在GP中有两种自定义方案可用于装载和卸载数据
使用自定义格式
在GP中可直接使用固定宽度数据的函数,需要指定自定义的格式和在formatter参数中指定函数名称。例如,
CREATE READABLE EXTERNAL TABLE tb_ext_cs01 (id int, name text) LOCATION ('gpfdist://mdw:8081/a_cs.txt') FORMAT 'CUSTOM' (formatter=fixedwidth_in, id='2',name='3');
- 1
- 2
- 3
下面列举的可以覆盖大部分场景:
line_delim=E’\n’ line_delim=E’\r’ line_delim=E’\r\n’ line_delim=‘’ (没有分隔行)
- 1
- 2
- 3
- 4
例如,
CREATE READABLE EXTERNAL TABLE tb_ext_cs02 (id int, name text) LOCATION ('gpfdist://mdw:8081/b_cs.txt') FORMAT 'CUSTOM' (formatter=fixedwidth_in, id='2',name='3', preserve_blanks='on',null='NUL');
- 1
- 2
- 3
- 4
如果现有的协议(gpfdist、http、file等)不能够很好的用于访问数据,可以编写自定义的协议。
使用gpload装载数据
该文件指定了GP的连接信息,gpfdist配置信息,外部表选项以及数据格式。例如,
VERSION: 1.0.0.1 DATABASE: testdw USER: gpadmin HOST: mdw PORT: 5432 GPLOAD: INPUT: - SOURCE: LOCAL_HOSTNAME: - mdw PORT: 8081 FILE: - /data/load_files/a.txt - COLUMNS: - id: int - name: text - FORMAT: text - DELIMITER: '|' - ERROR_LIMIT: 1 - ERROR_TABLE: err_a OUTPUT: - TABLE: tb_gf01 - MODE: INSERT SQL: - BEFORE: "INSERT INTO audit VALUES('start', current_timestamp)" - AFTER: "INSERT INTO audit VALUES('end', current_timestamp)"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
3) 通过装载控制文件运行gpload命令,例如:
- 1
使用COPY装载数据
4) 使用单条记录错误隔离模式运行COPY(跟定义外部表一样),例如:
CREATE TABLE tb_ext_cp01 (LIKE tb_ext_gf01); COPY tb_ext_cp01 FROM '/data/load_files/a.txt‘ WITH DELIMITER '|' LOG ERRORS INTO err_tb_ext_cp01 SEGMENT REJECT LIMIT 2 ROWS;
- 1
- 2
- 3
- 4
数据装载性能技巧
3) 在装载出错后执行VACUUM:错误发生前的记录无法访问,但仍然占据磁盘空间
从GP中卸载数据
例如,
CREATE WRITABLE EXTERNAL TABLE tb_wext_gf01(LIKE tb_cp_02) LOCATION ('gpfdist://mdw:8081/tb_wext_gf01.out', 'gpfdist://mdw:8082/tb_wext_gf02.out') FORMAT 'TEXT' (DELIMITER ',') DISTRIBUTED RANDOMLY;
- 1
- 2
- 3
- 4
- 5
e) 在外部表定义的EXECUTE子句中,可根据需要设置环境变量。例如,
CREATE WRITABLE EXTERNAL WEB TABLE tb_wext_wb01 (output text) EXECUTE 'export PATH=$PATH:/home/gpadmin;myprogram.sh‘ FORMAT 'TEXT‘ DISTRIBUTED RANDOMLY;
- 1
- 2
- 3
- 4
外部表执行OS命令或者脚本有一定的风险,根据需要,可以禁止在WEB表定义中使用EXECUTE。在Master的postgresql.conf文件设置:
gp_external_enable_exec = off
- 1
例如:
COPY (SELECT * FROM tb_cp_02 WHERE date LIKE '2013%') TO '/data/unload/tb_cp_02_2013.out';
- 1
手工修改:
update pg_class set reltuples=500000, relpages=150 where relname='tb_wext_gf01';