Greenplum中装载和卸载数据

匿名 (未验证) 提交于 2019-12-03 00:18:01

装载和卸载数据

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';


原创链接地址

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!