OSS 外部テーブルを使用して、Object Storage Service (OSS) からデータをインポートし、分析します。これらのテーブルは OSS 外部データラッパー (FDW) に基づき、クロスアカウントのデータインポートもサポートしています。
制限事項
AnalyticDB for PostgreSQL インスタンスと OSS バケットは、同一リージョンに配置されている必要があります。
機能
OSS FDW は PostgreSQL 外部データラッパー (FDW) フレームワークに基づいており、次のことが可能になります。
-
OSS からローカルの行指向テーブルまたは列指向テーブルにデータをインポートして、分析を高速化します。
-
OSS 内の大量のデータを直接クエリして分析します。
-
OSS 外部テーブルとローカルテーブルを結合して分析します。
OSS FDW は、次のデータファイル形式をサポートしています。
-
CSV、TEXT、JSON、JSON Lines 形式の非圧縮テキストファイル。
-
GZIP および Snappy で圧縮された、CSV および TEXT 形式のテキストファイル。
-
JSON および JSON Lines 形式の GZIP 圧縮テキストファイル。
-
ORC バイナリファイル。ORC と AnalyticDB for PostgreSQL 間のデータ型マッピングについては、「ORC ファイルのデータ型マッピング」をご参照ください。
-
Parquet バイナリファイル。Parquet と AnalyticDB for PostgreSQL 間のデータ型マッピングについては、「Parquet ファイルのデータ型マッピング」をご参照ください。
-
Avro バイナリファイル。Avro と AnalyticDB for PostgreSQL 間のデータ型マッピングについては、「Avro ファイルのデータ型マッピング」をご参照ください。
始める前に
OSS データの準備
サンプルファイル example.csv を準備します。
OSS バケット情報の確認
このセクションでは、[バケット]、[バケット名]、[アクセスタイプ]、[バケットドメイン名]の見つけ方を説明します。
-
OSS コンソールにログインします。
-
左側のナビゲーションウィンドウで、VPC 内 ECS からのアクセス (イントラネット) をクリックします。
-
エンドポイント ページで、ターゲットバケットをクリックします。
オブジェクト管理 ページで、バケット名 を確認できます。
-
[オブジェクト管理] ページで、オブジェクトパスを確認します。
-
左側のナビゲーションウィンドウで、概要 をクリックします。
-
概要 ページの [ポート] セクションで、エンドポイント と バケットドメイン名 を確認します。
[ECS から VPC (内部ネットワーク) 経由でのアクセス] のエンドポイントを使用することを推奨します。
AccessKey ID と AccessKey Secret の取得
AccessKey ID と AccessKey Secret を取得するには、「AccessKey の作成」をご参照ください。
OSS サーバーの作成
CREATE SERVER 文を使用して OSS サーバーを作成します。このサーバーは、アクセス先の OSS サービスへの接続を定義します。CREATE SERVER の詳細については、「CREATE SERVER」をご参照ください。
構文
CREATE SERVER server_name
FOREIGN DATA WRAPPER fdw_name
[ OPTIONS ( option 'value' [, ... ] ) ]
パラメーター
|
パラメーター |
型 |
必須 |
説明 |
|
server_name |
STRING |
はい |
OSS サーバーの名前。 |
|
fdw_name |
STRING |
はい |
サーバーを管理する外部データラッパーの名前。このパラメーターは |
次の表で、OPTIONS 句のパラメーターについて説明します。
|
パラメーター |
型 |
必須 |
説明 |
|
endpoint |
STRING |
はい |
OSS へのアクセスに使用するエンドポイント。AnalyticDB for PostgreSQL は内部エンドポイントのみをサポートしています。詳細については、「リージョンとエンドポイント」のパブリッククラウドセクションをご参照ください。 |
|
bucket |
STRING |
いいえ |
データファイルが保存されているバケットの名前。バケット名の取得方法の詳細については、「事前準備」をご参照ください。 説明
|
|
speed_limit |
NUMERIC |
いいえ |
タイムアウトを防ぐために、 このオプションは 説明
デフォルトでは、90 秒間連続して 1024 バイト未満のデータが転送された場合、タイムアウトがトリガーされます。詳細については、「OSS SDK Error Handling」をご参照ください。 |
|
speed_time |
NUMERIC |
いいえ |
このオプションは 説明
デフォルトでは、90 秒間連続して 1024 バイト未満のデータが転送された場合、タイムアウトがトリガーされます。詳細については、「OSS SDK Error Handling」をご参照ください。 |
|
connect_timeout |
NUMERIC |
いいえ |
接続タイムアウト期間。単位:秒。デフォルト値は 10 です。 |
|
dns_cache_timeout |
NUMERIC |
いいえ |
DNS キャッシュタイムアウト期間。単位:秒。デフォルト値は 60 です。 |
例
CREATE SERVER oss_serv
FOREIGN DATA WRAPPER oss_fdw
OPTIONS (
endpoint 'oss-cn-********.aliyuncs.com',
bucket 'adb-pg'
);
ALTER SERVER 文を使用して、OSS サーバーの設定を変更することもできます。詳細については、「ALTER SERVER」をご参照ください。
例:
-
OSS サーバーのオプションを変更します。
ALTER SERVER oss_serv OPTIONS(SET endpoint 'oss-cn-********.aliyuncs.com'); -
OSS サーバーにオプションを追加します。
ALTER SERVER oss_serv OPTIONS(ADD connect_timeout '20'); -
OSS サーバーからオプションを削除します。
ALTER SERVER oss_serv OPTIONS(DROP connect_timeout);
OSS サーバーを削除するには、DROP SERVER 文を使用します。詳細については、「DROP SERVER」をご参照ください。
OSS ユーザーマッピングの作成
OSS サーバーを作成した後、ユーザーマッピングも作成する必要があります。CREATE USER MAPPING 文は、AnalyticDB for PostgreSQL データベース内のユーザーと、OSS サーバーにアクセスするための認証情報との間のマッピングを定義します。詳細については、「CREATE USER MAPPING」をご参照ください。
構文
CREATE USER MAPPING FOR { username | USER | CURRENT_USER | PUBLIC }
SERVER <server_name>
[ OPTIONS ( option 'value' [, ... ] ) ]
パラメーター
|
パラメーター |
型 |
必須 |
説明 |
|
username |
文字列 |
はい。4つのオプションから1つを指定する必要があります。 |
AnalyticDB for PostgreSQL インスタンス内の、マッピングする既存ユーザーの名前。 |
|
USER |
文字列 |
AnalyticDB for PostgreSQL インスタンスの現在のユーザーをマッピングします。 |
|
|
CURRENT_USER |
文字列 |
||
|
PUBLIC |
文字列 |
AnalyticDB for PostgreSQL インスタンスのすべてのユーザー (今後作成されるユーザーも含む) に適用される、パブリックマッピングを作成します。 |
|
|
server_name |
文字列 |
はい |
OSS サーバーの名前。 |
次の表では、OPTIONS 句のパラメーターについて説明します。
|
パラメーター |
型 |
必須 |
説明 |
|
id |
文字列 |
はい |
AccessKey ID。取得方法については、「AccessKey ペアの作成」をご参照ください。 |
|
key |
文字列 |
はい |
AccessKey Secret。取得方法については、「AccessKey ペアの作成」をご参照ください。 |
Alibaba Cloud アカウント間でデータをインポートまたはエクスポートする場合、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」をご参照ください。
OSS 外部テーブルの作成
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 |
文字列 |
オブジェクトパスのプレフィックスを指定します。このプレフィックスで始まるパスを持つオブジェクトのみが選択されます。正規表現はサポートされていません。 例:
|
|
|
dir |
文字列 |
OSS のディレクトリパスは / で終わる必要があります。例:test/mydir/。 指定されたディレクトリ内のすべてのオブジェクトを選択します。サブディレクトリ内のオブジェクトは除外されます。 |
|
|
bucket |
文字列 |
いいえ |
データオブジェクトを含むバケットの名前です。バケット名の取得方法については、「準備」をご参照ください。 説明
|
|
format |
文字列 |
はい |
オブジェクトのフォーマットです。有効な値は次のとおりです。
|
|
filetype |
文字列 |
いいえ |
オブジェクトの圧縮タイプです。有効な値は次のとおりです。
説明
|
|
log_errors |
ブール値 |
いいえ |
エラーをログファイルに記録するかどうかを指定します。デフォルト値は 説明
このパラメーターは、csv および text 形式のオブジェクトにのみ適用されます。 |
|
segment_reject_limit |
数値 |
いいえ |
データロードタスクを中止させるエラーしきい値です。 値にパーセント記号 (
説明
このパラメーターは、csv および text 形式のオブジェクトにのみ適用されます。 |
|
header |
ブール値 |
いいえ |
ソースオブジェクトにヘッダー行が含まれているかどうかを指定します。有効な値は次のとおりです。
説明
このパラメーターは、csv 形式のオブジェクトにのみ適用されます。 |
|
delimiter |
文字列 |
いいえ |
フィールドを区切るデリミタです。1 バイト文字である必要があります。
説明
このパラメーターは、csv および text 形式のオブジェクトにのみ適用されます。 |
|
quote |
文字列 |
いいえ |
フィールドの引用符です。1 バイト文字である必要があります。デフォルトは二重引用符 ( 説明
このパラメーターは、csv 形式のオブジェクトにのみ適用されます。 |
|
escape |
文字列 |
いいえ |
特別な意味を持つ文字の前に置かれるエスケープ文字です。1 バイト文字である必要があります。デフォルトは二重引用符 ( 説明
このパラメーターは、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 外部テーブルを作成した後、テーブルがどの OSS オブジェクトにマッピングされているかを、次のいずれかの方法で確認できます。
-
方法 1:
EXPLAIN VERBOSE SELECT * FROM <OSS 外部テーブル名>; -
方法 2:
SELECT * FROM get_oss_table_meta('<OSS 外部テーブル名>');
DROP FOREIGN TABLE 文を使用して OSS 外部テーブルをドロップすることもできます。詳細については、「DROP FOREIGN TABLE」をご参照ください。
OSS データのクエリと分析
OSS 外部テーブルは、ローカルテーブルと同じ方法でクエリできます。次の例は、一般的なクエリを示しています。
-
キー値フィルターによるデータのクエリ
SELECT * FROM ossexample WHERE volume = 5; -
集計関数によるデータのクエリ
SELECT count(*) FROM ossexample WHERE volume = 5; -
GROUP BY 句、ORDER BY 句、LIMIT 句によるデータのクエリ
SELECT low, sum(volume) FROM ossexample GROUP BY low ORDER BY low limit 5;
OSS 外部テーブルを使用したJOIN 分析
-
exampleという名前のローカルテーブルを作成し、テストデータを挿入します。CREATE TABLE example (id int, volume int); INSERT INTO example VALUES(1,1), (2,3), (4,5); -
exampleテーブルとossexampleテーブルに対して JOIN クエリを実行します。SELECT example.volume, min(example.id), max(example.id) 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 外部テーブルの作成」をご参照ください。
-
フォールトトレラントな OSS 外部テーブルを作成します。
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 外部テーブルからデータを削除すると、OSS 内の基になるデータも削除されますか。
A: いいえ。OSS 外部テーブルからデータを削除しても、OSS 内の基になるデータは削除されません。