gpload是Greenplum数据库提供的数据加载工具,同时支持开源Greenplum、Pivotal Greenplum及其他基于开源Greenplum的衍生版本(除非这个版本想不开,把这个功能阉割了🤦♂️)。

gpload属于客户端工具,类似于Oracle的SQL*Loader,如果服务器上已经安装了Greenplum的Server包,默认已经包含了gpload工具;另外您也可以将gpload的客户端(通常是从Pivotal官方取得的)安装到任意服务器上,安装完成后,需要打通该服务器与Greenplum所有服务器之间的网络。

从原理上讲,gpload属于对gpfdist服务的封装,在执行gpload入库时,大概执行的步骤为:启动gpfdist服务 -> 创建外部表 -> 将数据从外部表插入到内部表 -> 删除外部表 -> 关闭gpfdist服务。

1.gpload安装

依赖软件

  • gpload使用python语言编写的,所以会依赖python,当前与Greenplum对应的版本为python 2.7,还没有兼容到3.x版本;
  • 另外解析YAML文件时,使用了Python的PyYAML包,底层依赖libYAML,独立安装时需要自行注意

安装软件

软件的安装这里不详细介绍了,通常分为两种安装方式:

  • 采用Greenplum完整安装包安装,不管是bin文件还是rpm文件,都会自行安装所有依赖,具体步骤请参考官方文档;
  • 采用客户端包,名称类似于[greenplum-loaders-x.x.x-build-2-RHEL7-x86_64.zip],这种客户端提供windows版本安装包,通常可以一键执行安装;

设置环境变量

软件安装完成后,需要设置以下环境变量(以RHEL7为例):

# 在.bash_profile中添加Greenplum相关环境变量:
export PGDATABASE=postgres
export PGHOST=127.0.0.1
export PGPORT=5432
export PGUSER=gpadmin
export PGPASSWORD=gpadmin

2.gpload使用

准备测试环境

我们通过搭建一个简单模拟环境的方式来简单模拟gpload的使用,首先您的环境中需要已经安装完成Greenplum任意一个版本的数据库,然后创建数据库用内部表T1:

[gpadmin@allinone ~]$ psql
psql (9.4.24)
Type "help" for help.

postgres=# create table t1(id int,name text,cust_id text,create_time timestamp without time zone);

创建本地入库用的csv文件:

[gpadmin@allinone ~]$ cat test.csv
1|A|111
2|B|222
3|C|333
4|D|444

创建对应YAML文件

VERSION: 1.0.0.1 # 默认不修改
DATABASE: postgres # 对应入库的数据库名
USER: gpadmin # 通常都是gpadmin
HOST: 127.0.0.1 # Greenplum Master IP地址
PORT: 5432 # Greenplum Master 端口号
GPLOAD:
  INPUT:
    - SOURCE:
        LOCAL_HOSTNAME:
          - localhost # 当前安装了gpload客户端的主机IP
        PORT: 22222 # gpload启动使用的端口
        FILE:
          - /home/gpadmin/test.csv # csv文件绝对路径
    - COLUMNS:
        - ID: int # 对应外部表的数据类型,通常和数据库内部表一样
        - NAME: text # 对应外部表的数据类型,通常和数据库内部表一样
        - CUST_ID: text # 对应外部表的数据类型,通常和数据库内部表一样
    - FORMAT: csv # 格式
    - DELIMITER: '|' # csv文件分隔符
    - QUOTE: '"' # 字符串逃逸符
    - HEADER: false # csv不带表头,默认第一行不忽略
    - ERROR_LIMIT: 50 # 错误上线,达到50后执行失败
    - LOG_ERRORS: true # 存储入库错误
  OUTPUT: # 数据库内部表的映射关系
    - TABLE: t1 # 内部表名字
    - MODE: INSERT # 插入方式入库
    - MAPPING:
        ID: ID # 映射,前面是内部表字段,后面是映射的字段,后面的字段可以是外部表的字段或数据库函数
        NAME: NAME
        CUST_ID: CUST_ID
        CREATE_TIME: now()
  PRELOAD:
    - REUSE_TABLES: false # 默认外部表不重用

执行入库测试

[gpadmin@allinone ~]$ gpload -f test.yml
2021-03-23 15:14:11|INFO|gpload session started 2021-03-23 15:14:11
2021-03-23 15:14:11|INFO|setting schema 'public' for table 't1'
2021-03-23 15:14:11|INFO|started gpfdist -p 22222 -P 22223 -f "/home/gpadmin/test.csv" -t 30
2021-03-23 15:14:11|INFO|running time: 0.07 seconds
2021-03-23 15:14:11|INFO|rows Inserted          = 4
2021-03-23 15:14:11|INFO|rows Updated           = 0
2021-03-23 15:14:11|INFO|data formatting errors = 0
2021-03-23 15:14:11|INFO|gpload succeeded

执行完成后,查看数据库中表的数据:

postgres=# select * from t1;
 id | name | cust_id |     create_time
----+------+---------+---------------------
  1 | A    | 111     | 2021-03-23 15:14:12
  2 | B    | 222     | 2021-03-23 15:14:12
  3 | C    | 333     | 2021-03-23 15:14:12
  4 | D    | 444     | 2021-03-23 15:14:12
(4 rows)

至此,一个使用gpload的简单例子就结束了。

------------------------------2022-01-02更新---------------------------------