GreenPlum数据加载工具gpload
Feb042016
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控制文件模版,缩进问题就很头疼。