OSS FDW (外部データラッパー) を使用すると、AnalyticDB for PostgreSQL は Object Storage Service (OSS) に保存されているデータファイルをデータベースに移動することなく、直接読み取り、クエリを実行できます。PostgreSQL FDW をベースとして構築されており、クロスアカウントアクセスと幅広いファイル形式をサポートしています。
OSS 外部テーブルを使用すると、次のことができます。
OSS データを AnalyticDB for PostgreSQL の行指向または列指向テーブルにインポートし、分析を高速化します。
大量の OSS データをその場でクエリおよび分析します。
単一のクエリで OSS 外部テーブルと AnalyticDB for PostgreSQL テーブルを結合します。
サポートされている形式
| 形式 | 圧縮 |
|---|---|
| CSV | 非圧縮、GZIP、標準 Snappy |
| TEXT | 非圧縮、GZIP、標準 Snappy |
| JSON | 非圧縮、GZIP |
| JSON Lines | 非圧縮、GZIP |
| ORC | — |
| Parquet | — |
| Avro | — |
Hadoop Snappy 圧縮オブジェクトはサポートされていません。ORC、Parquet、Avro と AnalyticDB for PostgreSQL の間のデータ型マッピングについては、「OSS 外部テーブルのデータ型マッピング」をご参照ください。
制限事項
AnalyticDB for PostgreSQL インスタンスと OSS バケットは、同じリージョンにある必要があります。
filetypeパラメーターは、CSV、TEXT、JSON、および JSON Lines オブジェクトにのみ適用されます。JSON および JSON Lines では Snappy 圧縮はサポートされていません。log_errorsおよびsegment_reject_limitパラメーターは、CSV および TEXT オブジェクトにのみ適用されます。OSS サーバーの
endpointパラメーターでは、内部 (VPC) エンドポイントのみがサポートされています。
前提条件
開始する前に、以下があることを確認してください。
同じリージョンにある AnalyticDB for PostgreSQL インスタンスと OSS バケット
OSS バケット名、オブジェクトパスまたはディレクトリ、および内部エンドポイント。詳細については、以下の「OSS バケット情報の取得」をご参照ください。
OSS バケットへのアクセス権を持つ AccessKey ID と AccessKey Secret。詳細については、「AccessKey ペアの作成」をご参照ください。
サンプルデータファイル。このトピックの例に従うには、example.csv をダウンロードしてください。
OSS バケット情報の取得
OSS コンソールにログインします。
左側のナビゲーションウィンドウで、[バケット] をクリックします。
[バケット]ページで、バケットの名前をクリックします。[バケット名]をメモしておいてください。
「[Object Management]」ページで、オブジェクトパスを確認してください。
左側のナビゲーションウィンドウで、[概要] をクリックします。
[ポート] セクションで、[VPC 経由のECS からのアクセス(内部ネットワーク)] エンドポイントを見つけます。 [エンドポイント] および [バケットドメイン名] をメモしてください。
パブリックネットワークの送信料金とレイテンシーを回避するために、可能な限り内部 (VPC) エンドポイントを使用してください。
仕組み
OSS FDW の設定には、3 つの DDL ステップがあります。
OSS サーバーの作成 — OSS エンドポイントとバケットを登録します。
ユーザーマッピングの作成 — ご利用の AnalyticDB for PostgreSQL データベースユーザーを OSS AccessKey 認証情報にバインドします。
OSS 外部テーブルの作成 — テーブルスキーマを定義し、OSS オブジェクトパスまたはディレクトリにマッピングします。
これらのステップの後、通常の AnalyticDB for PostgreSQL テーブルと同様に、標準 SQL を使用して外部テーブルをクエリします。
ステップ 1: OSS サーバーの作成
CREATE SERVER を実行して OSS エンドポイントを登録します。PostgreSQL リファレンスの詳細については、「CREATE SERVER」をご参照ください。
構文
CREATE SERVER server_name
FOREIGN DATA WRAPPER fdw_name
[ OPTIONS ( option 'value' [, ... ] ) ]パラメーター
| パラメーター | 必須 | 説明 |
|---|---|---|
server_name | はい | OSS サーバーの名前。 |
fdw_name | はい | oss_fdw である必要があります。 |
OPTIONS パラメーター:
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
endpoint | はい | — | 内部 OSS エンドポイント。内部エンドポイントのみがサポートされています。詳細については、「リージョンとエンドポイント」をご参照ください。 |
bucket | いいえ | — | OSS バケット名。サーバー、外部テーブル、またはその両方に設定する必要があります。両方に設定されている場合、外部テーブルの値が適用されます。 |
speed_limit | いいえ | 1024 バイト | タイムアウトがトリガーされる前の最小転送レート。speed_time が必要です。デフォルトでは、90 秒連続して 1,024 バイト未満しか転送されない場合、タイムアウトが発生します。 |
speed_time | いいえ | 90 秒 | speed_limit のタイムアウト期間。speed_limit が必要です。 |
connect_timeout | いいえ | 10 秒 | 接続タイムアウト。 |
dns_cache_timeout | いいえ | 60 秒 | DNS 解決キャッシュタイムアウト。 |
例
CREATE SERVER oss_serv
FOREIGN DATA WRAPPER oss_fdw
OPTIONS (
endpoint 'oss-cn-********.aliyuncs.com',
bucket 'adb-pg'
);既存のサーバーを変更するには、ALTER SERVER を使用します。詳細については、「ALTER SERVER」をご参照ください。
-- パラメーターの変更
ALTER SERVER oss_serv OPTIONS (SET endpoint 'oss-cn-********.aliyuncs.com');
-- パラメーターの追加
ALTER SERVER oss_serv OPTIONS (ADD connect_timeout '20');
-- パラメーターの削除
ALTER SERVER oss_serv OPTIONS (DROP connect_timeout);サーバーを削除するには、DROP SERVER を使用します。詳細については、「DROP SERVER」をご参照ください。
ステップ 2: ユーザーマッピングの作成
CREATE USER MAPPING を実行して、データベースユーザーを OSS AccessKey 認証情報にバインドします。詳細については、「CREATE USER MAPPING」をご参照ください。
構文
CREATE USER MAPPING FOR { username | USER | CURRENT_USER | PUBLIC }
SERVER server_name
[ OPTIONS ( option 'value' [, ... ] ) ]パラメーター
| パラメーター | 説明 |
|---|---|
username | 特定の AnalyticDB for PostgreSQL データベースユーザー名。 |
USER / CURRENT_USER | 現在のデータベースユーザー。 |
PUBLIC | 今後作成されるユーザーを含む、すべてのデータベースユーザーのパブリックマッピングを作成します。 |
server_name | ステップ 1 の OSS サーバー名。 |
OPTIONS パラメーター:
| パラメーター | 必須 | 説明 |
|---|---|---|
id | はい | OSS バケットの AccessKey ID。詳細については、「AccessKey ペアの作成」をご参照ください。 |
key | はい | OSS バケットの AccessKey Secret。 |
クロスアカウントデータアクセスの場合、OSS バケットを所有する Alibaba Cloud アカウントの AccessKey ID と AccessKey Secret を使用します。
例
CREATE USER MAPPING FOR PUBLIC
SERVER oss_serv
OPTIONS (
id 'LTAI****************',
key 'yourAccessKeySecret'
);ユーザーマッピングを削除するには、DROP USER MAPPING を使用します。詳細については、「DROP USER MAPPING」をご参照ください。
ステップ 3: OSS 外部テーブルの作成
CREATE FOREIGN TABLE を実行して、テーブルスキーマを定義し、OSS オブジェクトにマッピングします。詳細については、「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 外部テーブルの名前。 |
column_name | はい | 列名。 |
data_type | はい | 列のデータの型。 |
OPTIONS パラメーター:
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
filepath | はい (3 つのうちの 1 つ) | — | 完全な OSS オブジェクトパス。指定されたオブジェクトのみを選択します。 |
prefix | はい (3 つのうちの 1 つ) | — | オブジェクトパスのプレフィックス。パスがプレフィックスで始まるすべてのオブジェクトを選択します。正規表現はサポートされていません。 |
dir | はい (3 つのうちの 1 つ) | — | OSS ディレクトリパス。/ で終わる必要があります。サブディレクトリを除く、ディレクトリ内のすべてのオブジェクトを選択します。 |
bucket | いいえ | — | OSS バケット名。サーバーとテーブルの両方に設定されている場合、テーブルの値が適用されます。 |
format | はい | — | オブジェクト形式。有効な値: csv、text、orc、avro、parquet、json、jsonline。 |
filetype | いいえ | plain | 圧縮タイプ。有効な値: plain (圧縮なし)、gzip、snappy (標準 Snappy のみ)。CSV、TEXT、JSON、および JSON Lines にのみ適用されます。 |
log_errors | いいえ | false | 失敗する代わりにエラー行をログに記録するかどうか。CSV および TEXT のみ。 |
segment_reject_limit | いいえ | — | スキャンが停止する前のエラーしきい値。% サフィックスはパーセンテージを意味し、サフィックスがない場合は行数を意味します。たとえば、10% は、行の 10% を超えるエラーがある場合にスキャンを停止します。CSV および TEXT のみ。 |
header | いいえ | false | ソースオブジェクトにヘッダー行があるかどうか。CSV のみ。 |
delimiter | いいえ | , (CSV の場合)、タブ (TEXT の場合) | フィールドデリミタ。シングルバイト文字のみ。CSV および TEXT のみ。 |
quote | いいえ | " | 引用符文字。シングルバイト文字のみ。CSV のみ。 |
escape | いいえ | " | 引用符文字のエスケープ文字。シングルバイト文字のみ。CSV のみ。 |
null | いいえ | \N (CSV の場合)、空の文字列 (TEXT の場合) | NULL の文字列表現。CSV および TEXT のみ。 |
encoding | いいえ | クライアントエンコーディング | データファイルの文字エンコーディング。CSV および TEXT のみ。 |
force_not_null | いいえ | false | true の場合、空の文字列フィールド値は NULL として扱われません。CSV および TEXT のみ。 |
force_null | いいえ | false | true の場合、引用符で囲まれた空の文字列は NULL として扱われます。CSV および TEXT のみ。 |
prefix マッチングの仕組み:
prefix が test/filename の場合、次のオブジェクトが選択されます。
test/filenametest/filenamexxxtest/filename/aatest/filenameyyy/aatest/filenameyyy/bb/aa
prefix が test/filename/ の場合、test/filename/aa のみが選択されます。
例
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 オブジェクトにマッピングされていることを確認します。
-- 方法 1: クエリプランと一致するオブジェクトの確認
EXPLAIN VERBOSE SELECT * FROM ossexample;
-- 方法 2: 一致する OSS オブジェクトのリスト表示
SELECT * FROM get_oss_table_meta('ossexample');外部テーブルを削除するには、DROP FOREIGN TABLE を使用します。詳細については、「DROP FOREIGN TABLE」をご参照ください。
OSS データのクエリ
ネイティブ AnalyticDB for PostgreSQL テーブルをクエリするのと同じ方法で、標準 SQL を使用して OSS 外部テーブルをクエリします。
列値によるフィルタリング:
SELECT * FROM ossexample WHERE volume = 5;GROUP BY による集計:
SELECT low, sum(volume)
FROM ossexample
GROUP BY low
ORDER BY low
LIMIT 5;一致する行数のカウント:
SELECT count(*) FROM ossexample WHERE volume = 5;OSS 外部テーブルと AnalyticDB for PostgreSQL テーブルの結合
ネイティブ AnalyticDB for PostgreSQL テーブルを作成し、データを挿入します。
CREATE TABLE example (id int, volume int); INSERT INTO example VALUES(1,1), (2,3), (4,5);OSS 外部テーブルをネイティブテーブルと結合します。
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 パラメーターを介したフォールトトレラントなスキャンをサポートしています。有効にすると、解析エラーのある行は、スキャン全体が失敗する代わりにログに記録されます。
フォールトトレラントな外部テーブルの作成:
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/',
format 'csv',
encoding 'utf8'
);エラーログのクエリ:
SELECT * FROM gp_read_error_log('oss_error_sales');エラーログのクリア:
SELECT gp_truncate_error_log('oss_error_sales');よくある質問
OSS 外部テーブルからデータを削除すると、OSS 内のデータも削除されますか?
いいえ。OSS 外部テーブルからデータを削除しても、OSS に保存されているデータは削除されません。