Greenplum数据加载方式(3) – gpload
8,310 total views, 2 views today
《Greenplum数据加载方式(1) – insert 和 copy》和 《Greenplum数据加载方式(2) – 外部表(gpfdist)》两篇文章介绍了Greenplum加载数据的三种方式。本篇引入Greenplum的第四种数据加载方式:gpload。
一、gpload原理介绍
gpload是GP使用可读外部表和GP并行文件服务gpfdist装载数据的一个命令包装。其允许通过使用配置文件的方式设置数据格式等来创建外部表定义。通过按照YAML格式定义的装载说明配置文件,然后执行insert、update、merger操作,将数据装载到目标数据库表中。
二、语法
请参考http://gpdb.docs.pivotal.io/4360/utility_guide/admin_utilities/gpload.html
三、创建YAML格式控制文件
该yaml文件解释:在10.9.15.18服务器上,存放着外部文件/home/gpadmin/script/member.txt。通过gpadmin用户把外部文件insert到到10.9.15.8的testDB的t表中;并把加载的开始和结束时间插入到audit审计表中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$ cat my_load.yml --- VERSION: 1.0.0.1 DATABASE: testDB USER: gpadmin HOST: 10.9.15.18 PORT: 5432 GPLOAD: INPUT: - SOURCE: LOCAL_HOSTNAME: - 10.9.15.18 PORT: 8081 FILE: - /home/gpadmin/script/member.txt - COLUMNS: - id: int - name: varchar(200) - FORMAT: text - DELIMITER: ',' - ERROR_LIMIT: 25 - ERROR_TABLE: public.t_err OUTPUT: - TABLE: public.t - MODE: insert SQL: - BEFORE: "INSERT INTO audit VALUES('start',current_timestamp)" - AFTER: "INSERT INTO audit VALUES('end',current_timestamp)" |
特别提醒:“-”后一定要有空格;“:”后也一定要有空格。
参数说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
VERSION 自定义版本号(可选项) DATABASE 需要连接的数据库,如果没有指定,根据$PGDATABASE变量确定 USER 执行操作的用户。如果没指定,根据$PGUSER变量确定 HOST 可选项。指定master节点的主机名(IP)。如果没指定,根据变量$PGHOST确定。 PORT 可选项。指定master的端口,默认是5432或者$GPORT。 GPLOAD 必须项。load部分的开始。一个GPLOAD部分必须包含一个INPUT和一个OUTPUT。 INPUT 必须项。定义加载数据的格式和位置。gpload在当前主机上启动一个或者多个gpfdist文件分布式实例 。注意,gpload命令所在主机可网络访问Greenplum中的每个节点(master&segment)。 SOURCE 必须项。INPUT部分的SOURCE块其定义了source文件所在位置。一个INPUT部分中可以有1个或者多个SOURCE块定义。 每个SOURCE块定义对应了一个本机的gpfdist实例。每个SOURCE块定义必须制定一个source文件。 LOCAL_HOSTNAME 可选项。gpload工具运行所在的主机名或者IP地址。如果这台主机有多个网卡,能同时使用每个网卡(每个网卡都有一个IP地址),通过设定LOCAL_HOSTNAME和PORT 实现多个gpfdist实例,可提升数据加载速度。默认情况,只使用主主机名或者IP地址。 PORT 可选项。gpfdist实例需要的端口。 FILE 必须项。文件位置。可同时制定多个相同格式的文件,入/home/gpadmin/script/*.txt。如果是gzip或bzip2文件,会自动解压(在环境变量中设定好gunzip、bunzip2的路径)。 CLOUMNS 可选项。说明source文件的格式,列名:数据类型。DELIMITER参数,指明source文件中两个数据之间的分隔符。如果没有指定COLUMNS选项,意味着source文件中的列的顺序、列的数量、数据类型都和目标表一致。COLUMN的作用:SOURCE_TO_TARGET的mapping关系。 FORMAT 可选项。source文件的类型,比如text、csv。默认text格式不说指定。 DELIMITER 可选项。一行数据中,各列的分隔符号。TEXT格式中默认tab作为分隔符;CSV中以都好","作为分隔符。 ERROR_LIMIT 可选项。允许的错误行数。加载数据时,错误数据将被忽略。如果没有到达错误限制数量,所有正常行会加载到GP中,问题行会存放到err_table中。如果超过错误值,正常数据也不会加载。 ERROR_TABLE 可选项。前提是开启了ERROR_LIMIT 。错误表将记录错误行。如果错误表不存在,会自动创建。若存在,直接插入数据。 EXTERNAL 可选项。定义外部表。 OUTPUT 必须项。定义最终source文件加载到的目标表。 TABLE 必须项。目标表。 MODE 可选项。有三种模式:insert,插入数据; update,当MATCH_COLUMNS参数值(相当于关联列)等于加载数据时,更新UPDATE_COLUMS参数设置的列(相当于update的列)。 并且,必须设置UPDATE_CONDITION参数(相当于where过滤条件)。merge, 加载数据时,插入目标表中不存在的数据,更新目标中存在的数据。 MATCH_COLUMNS 在UPDATE或者MERGE模式下使用。相当于关联列。这里写目标表的列名。 UPDATE_COLUMNS 在UPDATE或者MERGE模式下使用。更新的目标表列名。 UPDATE_CONDITION 可选项。目标表的列名,相当于where条件。用在update或者merge模式。 MAPPING 可选项。如果设置了MAPPING参数,那么前面设置的COLUMNS参数会失效,因为MAPPING级别高于COLUMNS。关联格式:target_column_name: source_column_name。where过滤格式:target_column_name: 'expression' RELOAD 可选项。导入时,是truncate之前目标表的数据,还是保留目标表数据。两种模式,TRUNCATE 和REUSE_TABLES。 SQL 可选项。定义开始运行gpload和gpload结束执行的SQL语句。BEFORE,开始运行gpload执行的SQL,SQL需单引号括起来;AFTER,gpload结束后执行的SQL,SQL需单引号括起来。 |
四、使用gpload命令加载数据
上面已经定义好了yaml文件,下面使用gpload加载数据。gpload命令执行期间有执行时间、插入行、更新行、数据错误次数等信息反馈,帮助DBA定位问题。
1 2 3 4 5 6 7 8 9 |
$ gpload -f /home/gpadmin/script/my_load.yml 2015-12-24 17:24:10|INFO|gpload session started 2015-12-24 17:24:10 2015-12-24 17:24:10|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/script/member.txt" -t 30 2015-12-24 17:24:10|WARN|2 bad rows 2015-12-24 17:24:10|INFO|running time: 0.21 seconds 2015-12-24 17:24:10|INFO|rows Inserted = 20 2015-12-24 17:24:10|INFO|rows Updated = 0 2015-12-24 17:24:10|INFO|data formatting errors = 2 2015-12-24 17:24:10|INFO|gpload succeeded with warnings |
至此,Greenplum的四种加载方式全部介绍完毕。在生产环境中,大家可以根据不同场景和需求选择合适方式,正确的选择能帮助您高效完成加载任务。
>> 更多关于greenplum安装部署的文章,请点击这里。