使用OSS Foreign Table进行数据湖分析
本文介绍如何使用OSS Foreign Table(OSS外表,简称OSS FDW)导入OSS中的数据并进行数据分析。OSS Foreign Table支持跨账号导入数据。
使用限制
云原生数据仓库 AnalyticDB PostgreSQL 版实例和OSS存储空间Bucket必须位于同一地域。
功能介绍
OSS FDW基于PG FDW(PostgreSQL Foreign Data Wrapper)框架进行开发,通过OSS FDW,您可以进行如下操作。
-
将OSS数据导入本地表(行存表或列存表)进行分析加速。
-
直接查询分析OSS的海量数据。
-
OSS外表与本地表关联分析。
OSS FDW支持多种格式的数据文件,适用不同的业务场景,具体文件格式如下。
-
支持访问CSV、TEXT、JSON、JSONLINE格式的非压缩文本文件。
-
支持访问CSV、TEXT格式的GZIP压缩、标准SNAPPY压缩文本文件。
-
支持访问JSON、JSONLINE格式的GZIP压缩文本文件。
-
支持访问ORC格式的二进制文件。ORC数据类型与AnalyticDB PostgreSQL版数据类型的映射关系,请参见ORC文件数据类型对照表。
-
支持访问PARQUET格式的二进制文件。PARQUET数据类型与AnalyticDB PostgreSQL版数据类型的映射关系,请参见Parquet文件数据类型对照表。
-
支持访问AVRO格式的二进制文件。AVRO数据类型与AnalyticDB PostgreSQL版数据类型的映射关系,请参见Avro文件数据类型对照表。
准备工作
准备OSS数据
准备示例文件example.csv。
获取OSS Bucket信息
以下内容将指导您获取Bucket名称、文件的路径、Endpoint(地域节点)和Bucket域名。
-
登录OSS管理控制台。
-
在左侧导航栏中,单击目标Bucket列表。
-
在Bucket列表,单击目标Bucket。
在Bucket列表页面,您可以获取Bucket名称。
-
在文件管理页面,您可以获取的Bucket中文件的路径。
-
单击左侧概览。
-
在概览页面的访问端口区域,您可以获取Endpoint(地域节点)和Bucket域名。
建议使用ECS的VPC网络访问(内网)的访问域名进行访问。
获取AccessKey ID和AccessKey Secret
获取AccessKey ID和AccessKey Secret的具体操作,请参见创建AccessKey。
创建OSS Server
使用CREATE SERVER语句创建OSS Server,指定需要访问的OSS服务端。更多关于CREATE SERVER的介绍,请参见CREATE SERVER。
语法
CREATE SERVER server_name
FOREIGN DATA WRAPPER fdw_name
[ OPTIONS ( option 'value' [, ... ] ) ]
参数选项
|
参数 |
类型 |
是否必填 |
说明 |
|
server_name |
字符串 |
是 |
OSS Server的名称。 |
|
fdw_name |
字符串 |
是 |
管理服务器的外部数据容器的名称,固定为oss_fdw。 |
OPTIONS参数选项请参见下表。
|
参数 |
类型 |
是否必填 |
说明 |
|
endpoint |
字符串 |
是 |
访问域名,即访问OSS的入口。云原生数据仓库 AnalyticDB PostgreSQL 版仅支持配置内网域名。详情请参见地域和Endpoint公共云小节。 |
|
bucket |
字符串 |
否 |
数据文件所属的Bucket的名称,获取方法请参见准备工作。 说明
|
|
speed_limit |
数值 |
否 |
触发超时的数据量。单位为字节,默认值为1024字节。 需要与speed_time参数配合使用。 说明
默认情况下,如果连续90秒传输的数据量少于1024字节,则会触发超时。具体信息,请参见OSS SDK 错误处理。 |
|
speed_time |
数值 |
否 |
触发超时的时间。单位为秒,默认值为90秒。 需要与speed_limit参数配合使用。 说明
默认情况下,如果连续90秒传输的数据量少于1024字节,则会触发超时。具体信息,请参见OSS SDK 错误处理。 |
|
connect_timeout |
数值 |
否 |
连接超时时间。单位为秒,默认值为10秒。 |
|
dns_cache_timeout |
数值 |
否 |
DNS超时时间。单位为秒,默认值为60秒。 |
示例
CREATE SERVER oss_serv
FOREIGN DATA WRAPPER oss_fdw
OPTIONS (
endpoint 'oss-cn-********.aliyuncs.com',
bucket 'adb-pg'
);
您也可以通过ALTER SERVER语句修改OSS Server的配置,使用方法,请参见ALTER SERVER。
修改OSS Server配置示例如下。
-
修改OSS Server中的某个参数。
ALTER SERVER oss_serv OPTIONS(SET endpoint 'oss-cn-********.aliyuncs.com'); -
添加OSS Server中的某个参数。
ALTER SERVER oss_serv OPTIONS(ADD connect_timeout '20'); -
删除OSS Server中的某个参数。
ALTER SERVER oss_serv OPTIONS(DROP connect_timeout);
您也可以通过DROP SERVER语句删除该OSS Server,使用方法,请参见DROP SERVER。
创建OSS User Mapping
创建OSS Server后,您还需要创建一个访问OSS Server的用户。您可以使用CREATE USER MAPPING语句创建OSS User Mapping,用于定义AnalyticDB PostgreSQL版数据库用户与访问OSS Server用户的映射关系。更多介绍,请参见CREATE USER MAPPING。
语法
CREATE USER MAPPING FOR { username | USER | CURRENT_USER | PUBLIC }
SERVER <server_name>
[ OPTIONS ( option 'value' [, ... ] ) ]
参数选项
|
参数 |
类型 |
是否必填 |
说明 |
|
username |
字符串 |
是,四选一 |
指定映射的AnalyticDB PostgreSQL版实例的用户名。 |
|
USER |
字符串 |
映射当前的AnalyticDB PostgreSQL版实例的用户名。 |
|
|
CURRENT_USER |
字符串 |
||
|
PUBLIC |
字符串 |
匹配所有AnalyticDB PostgreSQL版实例的用户名,包括以后创建的用户。 |
|
|
server_name |
字符串 |
是 |
OSS Server的名称。 |
OPTIONS参数选项请参见下表。
|
参数 |
类型 |
是否必填 |
说明 |
|
id |
字符串 |
是 |
AccessKey ID,获取方法,请参见创建AccessKey。 |
|
key |
字符串 |
是 |
AccessKey Secret,获取方法,请参见创建AccessKey。 |
跨账号导入或导出数据时,需要配置OSS Bucket所属阿里云账号的AccessKey ID和AccessKey Secret。
示例
CREATE USER MAPPING FOR PUBLIC
SERVER oss_serv
OPTIONS (
id 'LTAI****************',
key 'yourAccessKeySecret'
);
您也可以通过DROP USER MAPPING语句删除该用户,使用方法,请参见DROP USER MAPPING。
创建OSS FDW
拥有OSS Server和访问OSS Server的用户后,您可以开始创建OSS FDW。您可以使用CREATE FOREIGN TABLE语句创建OSS FDW,更多信息,请参见CREATE FOREIGN TABLE。
语法
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [
column_name data_type [ OPTIONS ( option 'value' [, ... ] ) ] [ COLLATE collation ] [ column_constraint [ ... ] ]
[, ... ]
] )
SERVER server_name
[ OPTIONS ( option 'value' [, ... ] ) ]
参数选项
|
参数 |
类型 |
是否必填 |
说明 |
|
table_name |
字符串 |
是 |
OSS FDW名称。 |
|
column_name |
字符串 |
是 |
列名。 |
|
data_type |
字符串 |
是 |
该列的数据类型。 |
OPTIONS参数选项请参见下表。
|
参数 |
类型 |
是否必填 |
说明 |
|
filepath |
字符串 |
是,三选一 |
OSS中包含路径的文件名称。 如果使用filepath参数,则仅选择指定文件。 |
|
prefix |
字符串 |
指定数据文件对应路径名的前缀,不支持正则表达式,仅支持匹配前缀。 如果使用prefix参数,则会选择含有这一前缀的所有OSS文件,例如:
|
|
|
dir |
字符串 |
OSS中的目录路径。目录路径需要以/结尾,例如test/mydir/。 如果使用dir参数,会选择虚拟目录下的所有文件,但不包括它的子目录和子目录下的文件。 |
|
|
bucket |
字符串 |
否 |
数据文件所属的Bucket的名称,获取方法请参见准备工作。 说明
|
|
format |
字符串 |
是 |
文件格式,取值范围如下。
|
|
filetype |
字符串 |
否 |
文件类型,取值范围如下。
说明
|
|
log_errors |
布尔型 |
否 |
是否将错误记录到日志文件。默认值为false。更多信息,请参见容错机制。 说明
该参数仅适用于CSV和TEXT格式的文件。 |
|
segment_reject_limit |
数值 |
否 |
异常中止任务(error abort)的数量。 包含%时表示错误行百分比,不包含%时表示错误行数。例如:
说明
该参数仅适用于CSV和TEXT格式的文件。 |
|
header |
布尔型 |
否 |
源文件中字段名是否包含header行,取值如下。
说明
该参数仅适用于CSV格式的文件。 |
|
delimiter |
字符串 |
否 |
字段分隔符,仅允许设置为单字节字符。
说明
该参数仅适用于CSV和TEXT格式的文件。 |
|
quote |
字符串 |
否 |
字段引号,仅允许设置为单字节字符。默认为双引号(")。 说明
该参数仅适用于CSV格式的文件。 |
|
escape |
字符串 |
否 |
声明匹配quote参数的字符串,只允许为单字节的字符。默认为双引号(")。 说明
该参数仅适用于CSV格式的文件。 |
|
null |
字符串 |
否 |
指定文件中的NULL字符串。
说明
该参数仅适用于CSV和TEXT格式的文件。 |
|
encoding |
字符串 |
否 |
指定数据文件编码。默认情况下为客户端编码。 说明
该参数仅适用于CSV和TEXT格式的文件。 |
|
force_not_null |
布尔型 |
否 |
是否声明字段的值不匹配空字符串,取值如下。
说明
该参数仅适用于CSV和TEXT格式的文件。 |
|
force_null |
布尔型 |
否 |
空字符串处理方法,取值如下。
说明
该参数仅适用于CSV和TEXT格式的文件。 |
示例
CREATE FOREIGN TABLE ossexample (
date text,
time text,
open float,
high float,
low float,
volume int
) SERVER oss_serv OPTIONS (dir 'dir_oss_adb/', format 'csv');
创建OSS FDW完成后,您可以通过如下方式查看OSS FDW匹配的OSS文件列表是否符合预期。
-
方法一:
EXPLAIN VERBOSE SELECT * FROM <OSS FDW表名>; -
方法二:
SELECT * FROM get_oss_table_meta('<OSS FDW表名>');
您也可以通过DROP FOREIGN TABLE语句删除该OSS FDW,使用方法,请参见DROP FOREIGN TABLE。
查询分析OSS数据
查询OSS FDW外表的数据与查询本地表数据方法一样,常见查询如下。
-
键值过滤查询,示例如下。
SELECT * FROM ossexample WHERE volume = 5; -
聚合查询,示例如下。
SELECT count(*) FROM ossexample WHERE volume = 5; -
过滤、分组和LIMIT查询,示例如下。
SELECT low, sum(volume) FROM ossexample GROUP BY low ORDER BY low limit 5;
OSS FDW外表与本地表关联分析
-
新建用于关联分析的本地表example,并插入测试数据,示例如下。
CREATE TABLE example (id int, volume int); INSERT INTO example VALUES(1,1), (2,3), (4,5); -
本地表example和OSS FDW外表ossexample执行关联查询,示例如下。
SELECT example.volume, min(high), max(low) FROM ossexample, example WHERE ossexample.volume = example.volume GROUP BY(example.volume) ORDER BY example.volume;
容错机制
OSS FDW通过log_errors和segment_reject_limit参数提供容错功能,原始数据中的错误数据不会导致OSS外表扫描停止。
关于log_errors和segment_reject_limit参数的信息,请参见创建OSS FDW。
-
创建支持容错的OSS FDW外表,示例如下。
CREATE FOREIGN TABLE oss_error_sales (id int, value float8, x text) SERVER oss_serv OPTIONS (log_errors 'true', -- 记录错误行信息 segment_reject_limit '10', -- 错误行数不得超过10行,否则会停止扫描。 dir 'error_sales/', -- 指定外表匹配的OSS文件目录 format 'csv', -- 指定按csv格式解析文件 encoding 'utf8'); -- 指定文件编码 -
查看错误行的日志,查看方式如下。
SELECT * FROM gp_read_error_log('oss_error_sales'); -
删除错误行的日志,删除方式如下。
SELECT gp_truncate_error_log('oss_error_sales');
常见问题
Q:删除OSS FDW上的数据时,能否同时删除OSS上的数据。
A:删除OSS FDW上的数据时,无法删除OSS上的数据。