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 , but found '', 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控制文件模版,缩进问题就很头疼。