云原生数据仓库AnalyticDB PostgreSQL版支持通过OSS外部表(gpossext功能),将数据并行从阿里云对象存储OSS导入到AnalyticDB PostgreSQL。
功能介绍
目前gpossext支持读写TEXT、CSV格式的文件以及GZIP压缩格式的TEXT、CSV文件。
gpossext架构图如下。

TEXT和CSV格式说明
下列几个参数可以在外表DDL参数中指定,用于规定读写OSS的文件格式:
- TEXT和CSV行分割符号是
\n
,也就是换行符。 - DELIMITER用于定义列的分割符:
- 当用户数据中包括DELIMITER时,则需要和QUOTE参数一同使用。
- 推荐的列分割符有
,
、\t
、|
或一些不常出现的字符。
- QUOTE用于包裹有特殊字符的用户数据(以列为单位):
- 包含有特殊字符的字符串会被QUOTE包裹,用于区分用户数据和控制字符。
- 如果不必要,例如整数,基于优化效率的考虑,不必使用QUOTE包裹数据。
- QUOTE不能和DELIMITER相同,默认QUOTE是双引号。
- 当用户数据中包含了QUOTE字符,则需要使用转义字符ESCAPE加以区分。
- ESCAPE用于特殊字符转义:
- 转义字符出现在需要转义的特殊字符前,表示它不是一个特殊字符。
- ESCAPE默认和QUOTE相同,为双引号
""
。 - 也支持设置成
\
(MySQL默认的转义字符)或别的字符。
控制字符和格式 | TEXT | CSV |
---|---|---|
DELIMITER(列分割符) | \t(Tab) | , (Comma) |
QUOTE(摘引) | " (Double-Quote) | "(Double-Quote) |
ESCAPE(转义) | (不适用) | 与QUOTE相同 |
NULL(空值) | \N(Backslash-N) | (无引号的空字符串) |
说明 所有的控制字符都必须是单字节字符。
注意事项
- 创建和使用外部表的语法,除了location相关参数,其余参数和Greenplum的使用方式相同。
- 数据导入导出的性能和AnalyticDB PostgreSQL的资源(CPU、I/O、内存、网络等)有关,也和OSS相关。为了获取最优的导入导出性能,建议在创建表时,使用列式存储加压缩功能。例如,指定子句
“WITH (APPENDONLY=true, ORIENTATION=column, COMPRESSTYPE=zlib, COMPRESSLEVEL=5, BLOCKSIZE=1048576)
,详细信息,请参见 Greenplum Database 表创建语法官方文档。 - 为了保证数据导入导出的性能,请保证OSS与AnalyticDB PostgreSQL在同一地域下。
操作步骤
操作示例
本文以目标表example为例,介绍将OSS的数据通过外部表导入目标表example。
执行如下查询计划,可以看到每个Segment节点都会从OSS并行拉取数据,然后通过执行节点Redistribution Motion将数据HASH计算后分发给对应的Segment节点,接收数据的Segment节点通过INSERT执行节点进行入库。
EXPLAIN INSERT INTO example SELECT * FROM ossexample;
QUERY PLAN
-----------------------------------------------------------------------------------------------
Insert (slice0; segments: 4) (rows=250000 width=92)
-> Redistribute Motion 4:4 (slice1; segments: 4) (cost=0.00..11000.00 rows=250000 width=92)
Hash Key: ossexample.date
-> External Scan on ossexample (cost=0.00..11000.00 rows=250000 width=92)
(4 rows)
SDK错误处理
当导入或导出操作出错时,错误日志可能会出现如下信息:
- code:出错请求的HTTP状态码。
- error_code:OSS的错误码。
- error_msg:OSS的错误信息。
- req_id:标识该次请求的UUID。当您无法解决问题时,可以凭req_id来请求OSS开发工程师的帮助。
具体信息,请参见OSS API 错误响应,超时相关的错误可以使用oss_ext相关参数处理。