# gpfdist外部表导出数据 本节通过一个简单的例子来说明如何使用gpfdist外部表来导出数据,使用gpfdist外部表导出数据一般有以下四个步骤。关于NULL值处理,分割符,换行符,转义字符以及编码的处理可以参考CREATE EXTERNAL TABLE的详细语法。 > - 启动gpfdist文件服务器 > - 准备导出的表 > - 定义外部表 > - 导出数据 ## 启动gpfdist文件服务器 在本例中,我们在一个节点上启动了两个gpfdist实例,分别使用/data1/load-files和/data2/load-files目录来存放导出的文件。两个gpfdist实例分别侦听在8081和8082端口。日志分别存放在/home/hawq/log1和/home/hawq/log2中。 gpfdist就像是一个文件服务器。其中-d选项指定的是目录是该文件服务器的根目录。 gpfdist -d /data1/load-files -p 8081 -l /data1/log1 gpfdist -d /data2/load-files -p 8082 -l /data2/log2 准备导出的表 假设我们有一个内部表expenses如下: ``` CREATE TABLE myexpenses(name text, date date, amount float4, category text, desc1 text); INSERT INTO myexpenses VALUES('john','2017-01-20',100.00,'travel','nothing'),('tom','2016-12-01',300,'taxi','nothing'); INSERT INTO myexpenses VALUES('marry','2017-01-21',1000.00,'travel','nothing'),('kurt','2016-12-02',800,'taxi','nothing'); ``` ``` etl=# select * from myexpenses; name | date | amount | category | desc1 -------+------------+--------+----------+--------- john | 2017-01-20 | 100 | travel | nothing tom | 2016-12-01 | 300 | taxi | nothing marry | 2017-01-21 | 1000 | travel | nothing kurt | 2016-12-02 | 800 | taxi | nothing (4 rows) ``` ## 定义(可写)外部表 可以使用下面的命令创建WRITABLE外部表。其中需要把etlhost-1替换为gpfdist所在机器的主机名。本机的可以使用localhost。 这里我们会把数据导出到两个文件中去,一个是sales1.out,一个是sales2.out ``` CREATE WRITABLE EXTERNAL TABLE expense_out (LIKE myexpenses) LOCATION ('gpfdist://etlhost-1:8081/sales1.out', 'gpfdist://etlhost-1:8082/sales2.out') FORMAT 'TEXT' ( DELIMITER '|' NULL ' ') DISTRIBUTED BY (name); ``` ## 导出数据 下面这条语句可以很简单的导出数据到 expense_out 外部表。 ``` INSERT INTO expense_out select * from myexpenses; ``` 现在你可以查看/data1/load-files和/data2/load-files目录下已经产生了相应文件: $ ls -al /data2/load-files/ total 8 drwxr-xr-x 3 oushu wheel 102 Jan 6 14:26 . drwxr-xr-x 4 oushu wheel 136 Jan 6 10:31 .. -rw------- 1 oushu wheel 65 Jan 6 14:26 sales2.out $ ls -al /data1/load-files/ total 8 drwxr-xr-x 3 oushu wheel 102 Jan 6 14:26 . drwxr-xr-x 4 oushu wheel 136 Jan 6 14:19 .. -rw------- 1 oushu wheel 72 Jan 6 14:26 sales1.out