GaussDB(DWS) GDS单文件并发导入
GaussDB(DWS) GDS在8.1版本中支持对一个文件进行并发导入,提升单文件的导入速率。
原理:
约束:
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无法分辨该换行符是字段中的换行符还是行中的分割符,因此第一个分片会成功导入两条数据,第二个分片导入失败。
- 点赞
- 收藏
- 关注作者
评论(0)