GaussDB(DWS) GDS单文件并发导入

举报
Kylin_Li 发表于 2021/05/24 09:32:15 2021/05/24
【摘要】 GaussDB(DWS) GDS在8.1版本中支持对一个文件进行并发导入,提升单文件的导入速率。原理:约束:1.仅支持text和csv文件2.文件被拆分的总数小于等于8。3.当前分片小于等于文件被拆分的总数– 创建目标表。postgres=# CREATE TABLE pipegds_widetb_1 (city integer, tel_num varchar(16), card_code...

GaussDB(DWS) GDS在8.1版本中支持对一个文件进行并发导入,提升单文件的导入速率。

原理:
image.png

约束:
1.仅支持text和csv文件,且CSV文件需要尽量保证每行数据只有一个换行。下面的示例对这种场景进行了说明。
2.文件被拆分的总数小于等于8。
3.当前分片小于等于文件被拆分的总数

– 创建目标表。

postgres=# CREATE TABLE pipegds_widetb_1 (city integer, tel_num varchar(16), card_code varchar(15), phone_code vcreate table pipegds_widetb_3 (city integer, tel_num varchar(16), card_code varchar(15), phone_code varchar(16), region_code varchar(6), station_id varchar(10), tmsi varchar(20), rec_date integer(6), rec_time integer(6), rec_type numeric(2), switch_id varchar(15), attach_city varchar(6), opc varchar(20), dpc varchar(20));

– 创建带有file_sequence字段的外表。

postgres=# CREATE FOREIGN TABLE gds_pip_csv_r_1( like pipegds_widetb_1) SERVER gsmpp_server OPTIONS (LOCATION ‘gsfs://127.0.0.1:8781/wide_tb.txt’, FORMAT ‘text’, DELIMITER E’|+|’, NULL ‘’, file_sequence ‘5-1’);
postgres=# CREATE FOREIGN TABLE gds_pip_csv_r_2( like pipegds_widetb_1) SERVER gsmpp_server OPTIONS (LOCATION ‘gsfs://127.0.0.1:8781/wide_tb.txt’, FORMAT ‘text’, DELIMITER E’|+|’, NULL ‘’, file_sequence ‘5-2’);
postgres=# CREATE FOREIGN TABLE gds_pip_csv_r_3( like pipegds_widetb_1) SERVER gsmpp_server OPTIONS (LOCATION ‘gsfs://127.0.0.1:8781/wide_tb.txt’, FORMAT ‘text’, DELIMITER E’|+|’, NULL ‘’, file_sequence ‘5-3’);
postgres=# CREATE FOREIGN TABLE gds_pip_csv_r_4( like pipegds_widetb_1) SERVER gsmpp_server OPTIONS (LOCATION ‘gsfs://127.0.0.1:8781/wide_tb.txt’, FORMAT ‘text’, DELIMITER E’|+|’, NULL ‘’, file_sequence ‘5-4’);
postgres=# CREATE FOREIGN TABLE gds_pip_csv_r_5( like pipegds_widetb_1) SERVER gsmpp_server OPTIONS (LOCATION ‘gsfs://127.0.0.1:8781/wide_tb.txt’, FORMAT ‘text’, DELIMITER E’|+|’, NULL ‘’, file_sequence ‘5-5’);

–将wide_tb.txt并发导入到pipegds_widetb_1。

lel on
postgres=# INSERT INTO pipegds_widetb_1 SELECT * FROM gds_pip_csv_r_1;
postgres=# INSERT INTO pipegds_widetb_1 SELECT * FROM gds_pip_csv_r_2;
postgres=# INSERT INTO pipegds_widetb_1 SELECT * FROM gds_pip_csv_r_3;
postgres=# INSERT INTO pipegds_widetb_1 SELECT * FROM gds_pip_csv_r_4;
postgres=# INSERT INTO pipegds_widetb_1 SELECT * FROM gds_pip_csv_r_5;
\parallel off

*注意

使用CSV格式进行并行导入时,在如下示例场景中会因为CSV本身的规则和GDS拆分逻辑冲突而导致其中的某些分片导入失败。

场景:csv文件中包含未转义的换行符,且该换行符被quote指定的字符所包含,并且该行数据处于逻辑分片的第一行。

示例:并行导入一个文件big.csv ,正确导入显示内容如下:
1111,"aaaaaa","bbbbbbbb" 2222,"ccccccccc"," ddddddd dd" 33333,"eeeeeeee","ffffffffffffff"
文件被拆分成两份后,第一个分片显示内容如下:
1111,"aaaaaa","bbbbbbbb" 2222,"ccccccccc"," d

第二个分片显示内容如下:
dddddd dd" 33333,"eeeeeeee","ffffffffffffff"

因为第二个分片第一行ddddd后面的换行符包含在一个双引号之间,导致GDS无法分辨该换行符是字段中的换行符还是行中的分割符,因此第一个分片会成功导入两条数据,第二个分片导入失败。

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。