DWS最佳实践(二)DWS数据的导入方式
1. Insert方式
(1) 插入单条数据
insert into A (col1,col2, …) values(val1,val2,…);
注:在面向分析型场景中,大多数表是基于列存进行存储,由于其底层存储方式的差异,导致单条insert方式效率低下,并且如果长时间进行单条insert插入数据,会导致严重的数据膨胀,进而严重影响查询性能,故并不推荐使用单条insert方式来进行大规模数据的导入。
(2)批量导入
insert into A (col1,col2,col3,…)values(val1,val2,val3,…),(val4,val5,val6,…),(val7,val8,val9,...);
(3)整表插入(表A和表A_temp的结构完全保持一致)
insert into A select * from A_temp;
2. copy方式
copy方式适合数据量写入量不大,并发度不高的场景。适用于进行微批插入。
(1) copy元命令
copy A from stdin with(format ‘CSV’, null ‘null’,delimiter ‘|’,encoding ‘utf8’);
从标准输入中copy数据到DWS的表A,具体参数说明:
a. Format:用来指定数据格式,可以是csv或者text;
b. Null:用来指定数据文件中空值的表示;
c. Delimiter: 用来指定数据使用的分隔符;
e. Encoding: 用来指定数据使用的编码方式;
copy A to stdout with(format ‘CSV’, null ‘null’,delimiter ‘|’,encoding ‘utf8’);
从DWS表A中copy数据到标准输出,参数同上。更多参数配置请参考官网资料:
https://support.huaweicloud.com/devg-dws/dws_04_0275.html
(2) copyManager
将copy元命令封装在DWS的Java驱动中,可以在应用端通过调用jdbc中的copyManager的接口实现copy方式导入数据,Java的样例工程请参考官网资料:
https://support.huaweicloud.com/devg-dws/dws_04_0853.html
3. OBS外表和GDS外表导入
Insert和copy方式导入数据都只是适合单次数据量较小的场景,是个串行的过程,效率较低;如果要想大数据量的批量导入、导出DWS,需要使用到OBS或GDS工具进行导入导出,可以充分发挥分布式架构的BULKLOAD优势,快速而高效的进行并行数据传输。
以导入为例,并行导入数据通过外表设置的策略,利用多DN并行的方式,将数据从数据源文件导入到数据库中:
(1)外表Foreign Table: 用于识别数据源文件的位置,文件格式,存放位置,编码格式,数据间的分隔符等信息。是关联数据文件与数据库实表的对象。
(2)目标表:数据库中的实表。数据源文件中的数据最终导入到这些表中存储,包括行存表和列存表。
(1)创建外表示例(以OBS外表为例):
Create table public.test_f( like public.test ) Server gsmpp_server Options ( Encoding ‘utf8’, Location ‘obs://dws-demo/tpch/’, Format ‘csv’, Delimiter ‘|’, Access_key ‘{access_key_value}’, Secret_access_key ‘{secret_access_key_value}’ );
安全须知:认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。
参数说明:
a. Encoding: 指定数据文件的编码格式名称;
b. Location: 外表的数据源位置,支持URL;
c. Format: 外表中数据文件的格式(text,csv);
d. Delimiter: 指定数据文件行数据字段分隔符,不指定使用默认分隔符;
e. Access_key/Secret_access_key: 用户的AK/SK,认证凭证,可在官网获取;
更多外表选项参数可以参考以下链接:
https://support.huaweicloud.com/devg-dws/sql_create_foreign_table_0001.html
(2)从外表导入数据到内表
insert into public.test select * from public.test_f;
- 点赞
- 收藏
- 关注作者
评论(0)