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更新---------------------------------