当前位置: 首页 > GreenPlum > 正文

GreenPlum数据加载工具gpload

GreenPlum数据库除了可以使用copy和外部表的方式加载数据外,还可以使用gpload工具进行数据加载。gpload工具是对外部表的封装,但是不需要在数据库中创建外部表,可以直接将数据从数据库外的文件加载到数据库的表中。使用gpload工具,需要编写gpload工具的控制文件,这个控制文件是使用yuml语言编写,如下是gpload工具的演示。

首先编写gpload的控制文件。

[gpadmin@sdw1 ~]$ cat gpload.yml 
---
VERSION: 1.0.0.1
DATABASE: dbdream
USER: gpadmin
HOST: mdw
PORT: 5432
GPLOAD:
  INPUT:
    - SOURCE:
        LOCAL_HOSTNAME:
          - sdw1
        PORT: 1234
        FILE:
          - /home/gpadmin/MED_ORD_PGM_D.txt
    - COLUMNS:
          - id: int
          - ord_id: int
          - brd_pgm_schd_id: int
          - prd_id: int
          - unt_prd_id: int
          - ord_acp_dtm: timestamp
          - ord_acp_crr: int
          - cust_id: int
    - FORMAT: text
    - DELIMITER: ','
    - ERROR_LIMIT: 25
    - error_table: public.med_ord_pgm_d_err
  OUTPUT:
    - TABLE: public.med_ord_pgm_d
    - MODE: INSERT

然后使用gpload工具,将数据加载到数据库。

[gpadmin@sdw1 ~]$ gpload -f gpload.yml 
2016-02-04 14:26:45|INFO|gpload session started 2016-02-04 14:26:45
Password: 
2016-02-04 14:27:02|INFO|started gpfdist -p 1234 -P 1235 -f "/home/gpadmin/MED_ORD_PGM_D.txt" -t 30
2016-02-04 14:27:04|INFO|running time: 18.66 seconds
2016-02-04 14:27:04|INFO|rows Inserted          = 1000000
2016-02-04 14:27:04|INFO|rows Updated           = 0
2016-02-04 14:27:04|INFO|data formatting errors = 0
2016-02-04 14:27:04|INFO|gpload succeeded

需要注意gpload的控制文件的缩进问题,同级的参数一定要保持一致的缩进,比如上文中的INPUT、OUTPUT要保持同样的缩进,否则在加载时会遇到下面的错误。

[gpadmin@sdw1 ~]$ gpload -f gpload.yml
2016-02-04 15:21:39|ERROR|configuration file error: expected <block end>, but found '<block mapping start>', line 30

source、column等同级的参数也要保持同样的缩进,否则会遇到下面的错误。

[gpadmin@sdw1 ~]$ gpload -f gpload.conf 
2016-01-30 18:00:32|ERROR|configuration file error: mapping values are not allowed here, line 6

还组要注意的是gpload的控制文件中,-后面一定要有空格,如果:后面要跟参数值,那么:后面也一定要有空格。

gpload控制文件中也可以写一些SQL语句,这样 在执行数据加载时,会运行这些SQL,如下:

---
VERSION: 1.0.0.1
DATABASE: dbdream
USER: gpadmin
HOST: mdw
PORT: 5432
GPLOAD:
  INPUT:
    - SOURCE:
        LOCAL_HOSTNAME:
          - sdw1
        PORT: 1234
        FILE:
          - /home/gpadmin/MED_ORD_PGM_D.txt
    - COLUMNS:
          - id: int
          - ord_id: int
          - brd_pgm_schd_id: int
          - prd_id: int
          - unt_prd_id: int
          - ord_acp_dtm: timestamp
          - ord_acp_crr: int
          - cust_id: int
    - FORMAT: text
    - DELIMITER: ','
    - ERROR_LIMIT: 25
    - error_table: public.med_ord_pgm_d_err
  OUTPUT:
    - TABLE: public.med_ord_pgm_d
    - MODE: INSERT
  SQL:
    - BEFORE: "truncate table public.med_ord_pgm_d"
    - AFTER: "ANALYZE med_ord_pgm_d"

before参数后面的SQL是在数据加载之前运行的,after参数后面的SQL是在加载完成之后运行的,比如上面的例子,在数据加载之前先清空表的数据,加载完成后,收集表的统计信息。

[gpadmin@sdw1 ~]$ gpload -f gpload.yml
2016-02-04 15:07:45|INFO|gpload session started 2016-02-04 15:07:45
Password: 
2016-02-04 15:07:48|INFO|started gpfdist -p 1234 -P 1235 -f "/home/gpadmin/MED_ORD_PGM_D.txt" -t 30
2016-02-04 15:07:51|INFO|running time: 6.18 seconds
2016-02-04 15:07:51|INFO|rows Inserted          = 1000000
2016-02-04 15:07:51|INFO|rows Updated           = 0
2016-02-04 15:07:51|INFO|data formatting errors = 0
2016-02-04 15:07:51|INFO|gpload succeeded

dbdream=# select count(*) from med_ord_pgm_d;
  count  
---------
 1000000
(1 row)

在gpload的帮助手册中,SQL的例子是在加载前向表中插入一条记录,记录加载的时间点,在加载完成后,再向表中插入一条记录,记录加载完成的时间点,这样就可以知道数据加载用了多长时间。

  SQL:
    - BEFORE: "INSERT INTO audit VALUES('start', 'current_timestamp')"
    - AFTER: "INSERT INTO audit VALUES('end', 'current_timestamp')"

gpload是对外部表的封装,使用gpfdist工具数据也是并行加载,但是个人认为,没有外部表的方式方便,最起码没有准确的gpload控制文件模版,缩进问题就很头疼。

本文固定链接: https://www.dbdream.com.cn/2016/02/greenplum%e6%95%b0%e6%8d%ae%e5%8a%a0%e8%bd%bd%e5%b7%a5%e5%85%b7gpload/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2016年02月04日发表在 GreenPlum 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: GreenPlum数据加载工具gpload | 信春哥,系统稳,闭眼上线不回滚!
关键字: , ,

GreenPlum数据加载工具gpload:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter