Greenplum在数据加载方面有一个明显的优势,就是支持数据的并发加载,gpfdist就是并发加载的工具,在数据库中对应的就是外部表。
外部表就是指表的数据存放在数据库之外的数据文件中。外部表是直接在segment上导入数据,相比与其它的ETL工具,因为需要经过GP的单点master(效率较低),这种方式速度会很快。
创建外部表语法:
CREATE EXTERNAL TABLE
Defines a new external table.
Synopsis
CREATE [READABLE] EXTERNAL [TEMPORARY | TEMP] TABLE table_name
( column_name data_type [, ...] | LIKE other_table )
LOCATION ('file://seghost[:port]/path/file' [, ...])
| ('gpfdist://filehost[:port]/file_pattern[#transform=trans_name]'
[, ...]
| ('gpfdists://filehost[:port]/file_pattern[#transform=trans_name]'
[, ...])
| ('pxf://path-to-data?PROFILE=profile_name[&SERVER=server_name][&custom-option=value[...]]'))
| ('s3://S3_endpoint[:port]/bucket_name/[S3_prefix] [region=S3-region] [config=config_file]')
[ON MASTER]
FORMAT 'TEXT'
[( [HEADER]
[DELIMITER [AS] 'delimiter' | 'OFF']
[NULL [AS] 'null string']
[ESCAPE [AS] 'escape' | 'OFF']
[NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
[FILL MISSING FIELDS] )]
| 'CSV'
[( [HEADER]
[QUOTE [AS] 'quote']
[DELIMITER [AS] 'delimiter']
[NULL [AS] 'null string']
[FORCE NOT NULL column [, ...]]
[ESCAPE [AS] 'escape']
[NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
[FILL MISSING FIELDS] )]
| 'CUSTOM' (Formatter=<formatter_specifications>)
[ ENCODING 'encoding' ]
[ [LOG ERRORS [PERSISTENTLY]] SEGMENT REJECT LIMIT count
[ROWS | PERCENT] ]
其中通过CREATE EXTERNAL TABLE 或CREATE EXTERNAL WEB TABLE 创建的是可读外部表;而通过CREATE WRITABLE EXTERNAL TABLE 或 CREATE WRITABLE EXTERNAL WEB TABLE创建的是可写外部表。
普通外部表和可写外部表区别:
1、普通外部表只能select,可写外部表只能insert;
2、可写外部表没有错误表;
3、可写外部表可以指定分布键,如果不指定,默认随机分布;普通外部表只能随机分布。
外部表还支持本地文件,不过效率较低,不建议使用。
gpfdist及外部表使用例子:
1、启动gpfdist
首先要在文件服务器启动gpfdist服务
[gpadmin@test180 ~]$ gpfdist -d /home/gpadmin -p 8081 -l /tmp/gpfdist.log &
[1] 2232
参数说明:
-d 数据文件所放的目录,我这里的路径为/home/gpadmin。
-p 设置访问gpfdist端口,这个可以根据实际情况写。
-l 设置日志文件所放的目录,这个参数也可以不用填写。
2、准备好数据文件,并创建外部表
postgres=# CREATE external table t1_ext(id int,info text)
location('gpfdist://192.168.7.180:8081/t1.txt')
format 'text' (delimiter as ' ' null as '' escape 'OFF');
CREATE EXTERNAL TABLE
Location中填写的gpfdist://服务器地址:端口/文件名称
服务器地址:就是安装linux系统的ip。
端口:就是上面自己配饰的访问gpfdist的端口。
文件名称:就是准备的数据文件名称。
format:设置加载数据文件的格式,delimiter as 定义数据之间的分隔符,这里用到的是空格, null as 定义了null用空值替换
3、外部表查询
postgres=# select * from t1_ext ;
id | info
----+------
1 | a
2 | b
3 | c
4 | d
5 | e
(5 rows)
我们可以直接编辑数据文件添加或删除数据,都会同步显示在外部表中。
除此之外,我们还可以利用外部表将数据库中表的数据导出到文件中。
首先同样是需要启动gpfdist,然后创建可写外部表:
postgres=# CREATE writable external table t2_ext(like t2)
postgres-# location('gpfdist://192.168.7.180:8081/t2.txt')
postgres-# format 'text' (delimiter ',')
postgres-# distributed by(id);
CREATE EXTERNAL TABLE
writable指定该表是可写的外部表。
然后我们将数据库中表t2的数据插入到外部表t2_ext中,则可以将数据导出到文件中:
postgres=# insert into t2_ext select * from t2 limit 5;
INSERT 0 5
查看生成文件:
[gpadmin@test180 ~]$ less t2.txt
500001,8de385b4bc273c3dd5057daad2bec6d2
500003,8de385b4bc273c3dd5057daad2bec6d2
500005,8de385b4bc273c3dd5057daad2bec6d2
500007,8de385b4bc273c3dd5057daad2bec6d2
500009,8de385b4bc273c3dd5057daad2bec6d2