使用HybridDB PG的外部表输出数据到OSS时,一般会输出成多个文件(文件个数一般与节点数个数一致)。如何输出为一个文件呢?步骤如下:
1)创建示例表:
create table t3 (a1 text, a2 text ,a3 text, a4 text) distributed by (a1);
insert into t3 values('xxxxxxx','yyyyy','zzzzz','wwwww');
insert into t3 select * from test;
insert into t3 select * from test;
insert into t3 select * from test;
insert into t3 select * from test;
insert into t3 select * from test;
insert into t3 select * from test;
2)创建外部表写表,按源数据表的结构创建外部表。注意:
- 相对于本地源表的表结构,需要添加一个临时字段,例如dummy_col,最好作为第一个字段。
- 添加外部表参数 file_name_generator_col = dummy_col 指定临时字段名;output_generator_col=false 指定这个临时字段中的数据不写入到文件中
drop external table test_oss_write;
create writable external table test_oss_write(
dummy_col text,
A1 text,
A2 text,
A3 text,
A4 text
)
location('oss://oss-cn-shanghai.aliyuncs.com
dir=output_x_file/
id=xxx
key=xxx
bucket=osshuadong2
output_generator_col=false
file_name_generator_col=dummy_col
') FORMAT 'csv' ( DELIMITER ',')
distributed by (dummy_col)
;
3) 定制 SQL 将test数据写入到 oss 中
set rds_write_oss_file_by_distribution_column=on;
insert into test_oss_write
Select key,a1,a2,a3,a4 from
(
select
floor(random()*(5-1)+1)::int::text || 'e' as key,
A1,A2,A3,A4
from t3
)t order by key;
注意:
- 使用随机数来指定产生的文件个数,这里我们需要输出4个文件,则使用 floor(random()*(5-1)+1)
- 写入文件时,给到写入节点的数据需要按照key有序,我们使用了order by, 也可以使用窗口函数。
最后OSS上能看到4个文件,且文件内容不包含用来定制文件名的虚拟列
$osscmd ls oss://osshuadong2/output_x_file
prefix list is:
object list is:
2018-04-18 15:54:18 2.46KB Standard oss://osshuadong2/output_x_file/1e_577353258534704.1
2018-04-18 15:54:18 2.46KB Standard oss://osshuadong2/output_x_file/2e_577353258534704.2
2018-04-18 15:54:18 2.51KB Standard oss://osshuadong2/output_x_file/3e_577353258534704.2
2018-04-18 15:54:18 2.34KB Standard oss://osshuadong2/output_x_file/4e_577353258534704.1
osscmd get oss://osshuadong2/output_x_file/3e_577353258534704.2 b.txt
cat b.txt
xxxxxxx,yyyyy,zzzzz,wwwww
xxxxxxx,yyyyy,zzzzz,wwwww
xxxxxxx,yyyyy,zzzzz,wwwww
xxxxxxx,yyyyy,zzzzz,wwwww
xxxxxxx,yyyyy,zzzzz,wwwww
xxxxxxx,yyyyy,zzzzz,wwwww
xxxxxxx,yyyyy,zzzzz,wwwww
xxxxxxx,yyyyy,zzzzz,wwwww
xxxxxxx,yyyyy,zzzzz,wwwww
xxxxxxx,yyyyy,zzzzz,wwwww
xxxxxxx,yyyyy,zzzzz,wwwww
xxxxxxx,yyyyy,zzzzz,wwwww
xxxxxxx,yyyyy,zzzzz,wwwww
xxxxxxx,yyyyy,zzzzz,wwwww
使