使用OSS Foreign Table進(jìn)行數(shù)據(jù)湖分析
本文介紹如何使用OSS Foreign Table(OSS外表,簡稱OSS FDW)導(dǎo)入OSS中的數(shù)據(jù)并進(jìn)行數(shù)據(jù)分析。
功能介紹
OSS FDW基于PG FDW(PostgreSQL Foreign Data Wrapper)框架進(jìn)行開發(fā),通過OSS FDW,您可以進(jìn)行如下操作:
將OSS數(shù)據(jù)導(dǎo)入本地表(行存表或列存表)進(jìn)行分析加速。
直接查詢分析OSS的海量數(shù)據(jù)。
OSS外表與本地表關(guān)聯(lián)分析。
OSS FDW支持多種格式的數(shù)據(jù)文件,適用不同的業(yè)務(wù)場景,具體文件格式如下:
支持訪問CSV、TEXT、JSON、JSONLINE格式的非壓縮文本文件。
支持訪問CSV、TEXT格式的GZIP壓縮、標(biāo)準(zhǔn)SNAPPY壓縮文本文件。
支持訪問JSON、JSONLINE格式的GZIP壓縮文本文件。
支持訪問ORC格式的二進(jìn)制文件。ORC數(shù)據(jù)類型與AnalyticDB PostgreSQL版數(shù)據(jù)類型的映射關(guān)系,請參見ORC文件數(shù)據(jù)類型對照表。
支持訪問PARQUET格式的二進(jìn)制文件。PARQUET數(shù)據(jù)類型與AnalyticDB PostgreSQL版數(shù)據(jù)類型的映射關(guān)系,請參見Parquet文件數(shù)據(jù)類型對照表。
支持訪問AVRO格式的二進(jìn)制文件。AVRO數(shù)據(jù)類型與AnalyticDB PostgreSQL版數(shù)據(jù)類型的映射關(guān)系,請參見Avro文件數(shù)據(jù)類型對照表。
準(zhǔn)備工作
準(zhǔn)備OSS數(shù)據(jù)
準(zhǔn)備示例文件example.csv。
獲取OSS Bucket信息
以下內(nèi)容將指導(dǎo)您獲取Bucket名稱、文件的路徑、Endpoint(地域節(jié)點(diǎn))和Bucket域名。
登錄OSS管理控制臺。
在左側(cè)導(dǎo)航欄中,單擊目標(biāo)Bucket列表。
在Bucket列表,單擊目標(biāo)Bucket。
您可以在Bucket列表頁面,您可以獲取Bucket名稱。
在文件管理頁面,您可以獲取的Bucket中文件的路徑。
單擊左側(cè)概覽。
在概覽頁面的訪問端口區(qū)域,您可以獲取Endpoint(地域節(jié)點(diǎn))和Bucket域名。
建議使用ECS的VPC網(wǎng)絡(luò)訪問(內(nèi)網(wǎng))的訪問域名進(jìn)行訪問。
獲取AccessKey ID和AccessKey Secret
獲取AccessKey ID和AccessKey Secret的具體操作,請參見創(chuàng)建AccessKey。
創(chuàng)建OSS Server
使用CREATE SERVER語句創(chuàng)建OSS Server,指定需要訪問的OSS服務(wù)端。更多關(guān)于CREATE SERVER的介紹,請參見CREATE SERVER。
語法
CREATE SERVER server_name
FOREIGN DATA WRAPPER fdw_name
[ OPTIONS ( option 'value' [, ... ] ) ]
參數(shù)選項(xiàng)
參數(shù) | 類型 | 是否必填 | 說明 |
server_name | 字符串 | 是 | OSS Server的名稱。 |
fdw_name | 字符串 | 是 | 管理服務(wù)器的外部數(shù)據(jù)容器的名稱,固定為oss_fdw。 |
OPTIONS參數(shù)選項(xiàng)請參見下表:
參數(shù) | 類型 | 是否必填 | 說明 |
endpoint | 字符串 | 是 | Bucket域名,獲取方法請參見準(zhǔn)備工作。 |
bucket | 字符串 | 否 | 數(shù)據(jù)文件所屬的Bucket的名稱,獲取方法請參見準(zhǔn)備工作。 說明
|
speed_limit | 數(shù)值 | 否 | 觸發(fā)超時(shí)的數(shù)據(jù)量。單位為字節(jié),默認(rèn)值為1024字節(jié)。 需要與speed_time參數(shù)配合使用。 說明 默認(rèn)情況下,如果連續(xù)90秒傳輸?shù)臄?shù)據(jù)量少于1024字節(jié),則會(huì)觸發(fā)超時(shí)。具體信息,請參見OSS SDK 錯(cuò)誤處理。 |
speed_time | 數(shù)值 | 否 | 觸發(fā)超時(shí)的時(shí)間。單位為秒,默認(rèn)值為90秒。 需要與speed_limit參數(shù)配合使用。 說明 默認(rèn)情況下,如果連續(xù)90秒傳輸?shù)臄?shù)據(jù)量少于1024字節(jié),則會(huì)觸發(fā)超時(shí)。具體信息,請參見OSS SDK 錯(cuò)誤處理。 |
connect_timeout | 數(shù)值 | 否 | 連接超時(shí)時(shí)間。單位為秒,默認(rèn)值為10秒。 |
dns_cache_timeout | 數(shù)值 | 否 | DNS超時(shí)時(shí)間。單位為秒,默認(rèn)值為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中的某個(gè)參數(shù):
ALTER SERVER oss_serv OPTIONS(SET endpoint 'oss-cn-********.aliyuncs.com');
添加OSS Server中的某個(gè)參數(shù):
ALTER SERVER oss_serv OPTIONS(ADD connect_timeout '20');
刪除OSS Server中的某個(gè)參數(shù):
ALTER SERVER oss_serv OPTIONS(DROP connect_timeout);
您也可以通過DROP SERVER語句刪除該OSS Server,使用方法,請參見DROP SERVER。
創(chuàng)建OSS User Mapping
創(chuàng)建OSS Server后,您還需要?jiǎng)?chuàng)建一個(gè)訪問OSS Server的用戶。您可以使用CREATE USER MAPPING語句創(chuàng)建OSS User Mapping,用于定義AnalyticDB PostgreSQL版數(shù)據(jù)庫用戶與訪問OSS Server用戶的映射關(guān)系。更多介紹,請參見CREATE USER MAPPING。
語法
CREATE USER MAPPING FOR { username | USER | CURRENT_USER | PUBLIC }
SERVER servername
[ OPTIONS ( option 'value' [, ... ] ) ]
參數(shù)選項(xiàng)
參數(shù) | 類型 | 是否必填 | 說明 |
username | 字符串 | 是,四選一 | 指定映射的AnalyticDB PostgreSQL版實(shí)例的用戶名。 |
USER | 字符串 | 映射當(dāng)前的AnalyticDB PostgreSQL版實(shí)例的用戶名。 | |
CURRENT_USER | 字符串 | ||
PUBLIC | 字符串 | 匹配所有AnalyticDB PostgreSQL版實(shí)例的用戶名,包括以后創(chuàng)建的用戶。 | |
servername | 字符串 | 是 | OSS Server的名稱。 |
OPTIONS參數(shù)選項(xiàng)請參見下表:
參數(shù) | 類型 | 是否必填 | 說明 |
id | 字符串 | 是 | AccessKey ID,獲取方法,請參見創(chuàng)建AccessKey。 |
key | 字符串 | 是 | AccessKey Secret,獲取方法,請參見創(chuàng)建AccessKey。 |
示例
CREATE USER MAPPING FOR PUBLIC
SERVER oss_serv
OPTIONS (
id 'LTAI5t7Ge***************',
key 'FikziJd2La*******************'
);
您也可以通過DROP USER MAPPING語句刪除該用戶,使用方法,請參見DROP USER MAPPING。
創(chuàng)建OSS FDW
擁有OSS Server和訪問OSS Server的用戶后,您可以開始創(chuàng)建OSS FDW。您可以使用CREATE FOREIGN TABLE語句創(chuàng)建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' [, ... ] ) ]
參數(shù)選項(xiàng)
參數(shù) | 類型 | 是否必填 | 說明 |
table_name | 字符串 | 是 | OSS FDW名稱。 |
column_name | 字符串 | 是 | 列名。 |
data_type | 字符串 | 是 | 該列的數(shù)據(jù)類型。 |
OPTIONS參數(shù)選項(xiàng)請參見下表:
參數(shù) | 類型 | 是否必填 | 說明 |
filepath | 字符串 | 是,三選一 | OSS中包含路徑的文件名稱。 如果使用filepath參數(shù),則僅選擇指定文件。 |
prefix | 字符串 | 指定數(shù)據(jù)文件對應(yīng)路徑名的前綴,不支持正則表達(dá)式,僅是匹配前綴。 如果使用prefix參數(shù),則會(huì)選擇含有這一前綴的所有OSS文件,例如:
| |
dir | 字符串 | OSS中的目錄路徑。目錄路徑需要以/結(jié)尾,例如test/mydir/。 如果使用dir參數(shù),會(huì)選擇虛擬目錄下的所有文件,但不包括它的子目錄和子目錄下的文件。 | |
bucket | 字符串 | 否 | 數(shù)據(jù)文件所屬的Bucket的名稱,獲取方法請參見準(zhǔn)備工作。 說明
|
format | 字符串 | 是 | 文件格式,取值范圍如下:
|
filetype | 字符串 | 否 | 文件類型,取值范圍如下:
說明
|
log_errors | 布爾型 | 否 | 是否將錯(cuò)誤記錄到日志文件。默認(rèn)值為false。更多信息,請參見容錯(cuò)機(jī)制。 說明 該參數(shù)僅適用于CSV和TEXT格式的文件。 |
segment_reject_limit | 數(shù)值 | 否 | 異常中止任務(wù)(error abort)的數(shù)量。 包含%時(shí)表示錯(cuò)誤行百分比,不包含%時(shí)表示錯(cuò)誤行數(shù)。例如:
說明 該參數(shù)僅適用于CSV和TEXT格式的文件。 |
header | 布爾型 | 否 | 源文件中字段名是否包含header行,取值如下:
說明 該參數(shù)僅適用于CSV格式的文件。 |
delimiter | 字符串 | 否 | 字段分隔符,僅允許設(shè)置為單字節(jié)字符。
說明 該參數(shù)僅適用于CSV和TEXT格式的文件。 |
quote | 字符串 | 否 | 字段引號,僅允許設(shè)置為單字節(jié)字符。默認(rèn)為雙引號(")。 說明 該參數(shù)僅適用于CSV格式的文件。 |
escape | 字符串 | 否 | 聲明匹配quote參數(shù)的字符串,只允許為單字節(jié)的字符。默認(rèn)為雙引號(")。 說明 該參數(shù)僅適用于CSV格式的文件。 |
null | 字符串 | 否 | 指定文件中的NULL字符串。
說明 該參數(shù)僅適用于CSV和TEXT格式的文件。 |
encoding | 字符串 | 否 | 指定數(shù)據(jù)文件編碼。默認(rèn)情況下為客戶端編碼。 說明 該參數(shù)僅適用于CSV和TEXT格式的文件。 |
force_not_null | 布爾型 | 否 | 是否聲明字段的值不匹配空字符串,取值如下:
說明 該參數(shù)僅適用于CSV和TEXT格式的文件。 |
force_null | 布爾型 | 否 | 空字符串處理方法,取值如下:
說明 該參數(shù)僅適用于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');
創(chuàng)建OSS FDW完成后,您可以通過如下方式查看OSS FDW匹配的OSS文件列表是否符合預(yù)期:
方法一:
EXPLAIN VERBOSE SELECT * FROM <OSS FDW表名>;
方法二:
SELECT * FROM get_oss_table_meta('<OSS FDW表名>');
您也可以通過DROP FOREIGN TABLE語句刪除該OSS FDW,使用方法,請參見DROP FOREIGN TABLE。
查詢分析OSS數(shù)據(jù)
查詢OSS FDW外表的數(shù)據(jù)與查詢本地表數(shù)據(jù)方法一樣,常見查詢?nèi)缦拢?/p>
鍵值過濾查詢,示例如下:
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外表與本地表關(guān)聯(lián)分析
新建用于關(guān)聯(lián)分析的本地表example,并插入測試數(shù)據(jù),示例如下:
CREATE TABLE example (id int, volume int); INSERT INTO example VALUES(1,1), (2,3), (4,5);
本地表example和OSS FDW外表ossexample執(zhí)行關(guān)聯(lián)查詢,示例如下:
SELECT example.volume, min(high), max(low) FROM ossexample, example WHERE ossexample.volume = example.volume GROUP BY(example.volume) ORDER BY example.volume;
容錯(cuò)機(jī)制
OSS FDW通過log_errors和segment_reject_limit參數(shù)提供容錯(cuò)功能,原始數(shù)據(jù)中的錯(cuò)誤數(shù)據(jù)不會(huì)導(dǎo)致OSS外表掃描停止。
關(guān)于log_errors和segment_reject_limit參數(shù)的信息,請參見創(chuàng)建OSS FDW。
創(chuàng)建支持容錯(cuò)的OSS FDW外表,示例如下:
CREATE FOREIGN TABLE oss_error_sales (id int, value float8, x text) SERVER oss_serv OPTIONS (log_errors 'true', -- 記錄錯(cuò)誤行信息 segment_reject_limit '10', -- 錯(cuò)誤行數(shù)不得超過10行,否則會(huì)停止掃描。 dir 'error_sales/', -- 指定外表匹配的OSS文件目錄 format 'csv', -- 指定按csv格式解析文件 encoding 'utf8'); -- 指定文件編碼
查看錯(cuò)誤行的日志,查看方式如下:
SELECT * FROM gp_read_error_log('oss_error_sales');
刪除錯(cuò)誤行的日志,刪除方式如下:
SELECT gp_truncate_error_log('oss_error_sales');
常見問題
Q:刪除OSS FDW上的數(shù)據(jù)時(shí),能否同時(shí)刪除OSS上的數(shù)據(jù)。
A:刪除OSS FDW上的數(shù)據(jù)時(shí),無法刪除OSS上的數(shù)據(jù)。