Greenplum外部表数据加载——gpfdist

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

发布了161 篇原创文章 · 获赞 95 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_39540651/article/details/105680574