このトピックでは、Object Storage Service (OSS) 外部テーブルを使用して、OSS外部データラッパー (FDW) に基づいてデータ分析用にOSSデータをインポートする方法について説明します。
説明
OSS FDWは、PostgreSQL FDWに基づいて開発されています。 OSS FDWでは、次の操作を実行できます。
OSSデータをAnalyticDB for PostgreSQLインスタンスの行指向または列指向のテーブルにインポートして、データ分析を高速化します。
大量のOSSデータを照会および分析します。
データ分析のために、OSS外部テーブルをAnalyticDB for PostgreSQLテーブルに結合します。
OSS FDWは、さまざまなビジネスシナリオで次のデータオブジェクトをサポートします。
圧縮されていないCSV、TEXT、JSON、およびJSON Linesオブジェクト。
GZIP-および標準のSnappy-圧縮されたCSVおよびTEXTオブジェクト。
GZIP圧縮されたJSONおよびJSON Linesオブジェクト。
ORCバイナリオブジェクト。 ORCとAnalyticDB For PostgreSQL間のデータ型マッピングの詳細については、OSS外部テーブルのデータ型マッピングのトピックの「ORCとAnalyticDB for PostgreSQL間のデータ型マッピング」を参照してください。
Parquetバイナリオブジェクト。 ParquetとAnalyticDB For PostgreSQL間のデータ型マッピングの詳細については、OSS外部テーブルのデータ型マッピングのトピックの「ParquetとAnalyticDB for PostgreSQL間のデータ型マッピング」を参照してください。
Arvoバイナリオブジェクト。 ArvoとAnalyticDB For PostgreSQL間のデータ型マッピングの詳細については、OSS外部テーブルのデータ型マッピングのトピックの「AvroとAnalyticDB for PostgreSQL間のデータ型マッピング」を参照してください。
準備
OSSデータの準備
example.csvという名前のサンプルファイルを準備します。
OSSバケット情報の取得
次の手順では、バケット名、オブジェクトパス、エンドポイント、およびバケットドメイン名を取得する方法を示します。
左側のナビゲーションウィンドウで、バケツ.
バケツページで、バケットの名前をクリックします。
バケット名は [バケット] ページで取得できます。
オブジェクト管理ページでオブジェクトパスを取得します。
左側のナビゲーションウィンドウで、概要.
ポートのセクション概要ページを取得し、エンドポイントおよび対応するバケットドメイン名.
データアクセスには、VPC (内部ネットワーク) 経由のECSからのアクセスのエンドポイントを使用することを推奨します。
AccessKey IDとAccessKey secretの取得
AccessKey IDとAccessKeyシークレットの取得方法については、「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 | 継続する | サーバーを管理する外部データラッパーの名前。自動的にoss_fdwに設定されます。 |
次の表に、OPTIONSに含まれるパラメーターを示します。
パラメーター | データ型 | 必須 | 説明 |
endpoint | STRING | 継続する | バケットのドメイン名。 ドメイン名の取得方法については、このトピックの「準備」を参照してください。 |
バケット | STRING | 継続しない | データオブジェクトを格納するバケットの名前。 バケット名の取得方法については、このトピックの「準備」を参照してください。 説明
|
speed_limit | NUMERIC | 継続しない | タイムアウトをトリガーする送信しきい値。 デフォルト値: 1024。 単位はバイトです。 このパラメーターを指定すると、speed_timeパラメーターが必要になります。 説明 デフォルトでは、90秒以内に1,024バイト未満のデータが送信されると、タイムアウトがトリガーされます。 詳細については、次をご参照ください: エラー処理 |
speed_time | NUMERIC | 継続しない | タイムアウト期間のしきい値。 デフォルト値: 90。 単位は秒です。 このパラメーターを指定する場合、speed_limitパラメーターが必要です。 説明 デフォルトでは、90秒以内に1,024バイト未満のデータが送信されると、タイムアウトがトリガーされます。 詳細については、次をご参照ください: エラー処理 |
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');
パラメーターを追加します。
ALTER SERVER oss_serv OPTIONS(ADD connect_timeout '20');
パラメータを削除します。
ALTER SERVER oss_serv OPTIONS(DROP connect_timeout);
DROP SERVERステートメントを実行して、OSSサーバーを削除することもできます。 詳細については、「DROP SERVER」をご参照ください。
OSSサーバーへのユーザーマッピングの作成
OSSサーバーを作成した後、OSSサーバーにアクセスするユーザーを作成する必要があります。 CREATE USER MAPPINGステートメントを実行して、AnalyticDB for PostgreSQLデータベースユーザーとOSSサーバーにアクセスするユーザー間のユーザーマッピングを作成できます。 詳細については、「ユーザーマッピングの作成」をご参照ください。
構文
CREATE USER MAPPING FOR { username | USER | CURRENT_USER | PUBLIC }
SERVER servername
[ OPTIONS ( option 'value' [, ... ] ) ]
パラメーター
パラメーター | データ型 | 必須 | 説明 |
username | STRING | はい、4つのパラメータの1つ | マッピングするAnalyticDB for PostgreSQLインスタンスのデータベースユーザー名。 |
USER | STRING | マッピングするAnalyticDB for PostgreSQLインスタンスの現在のデータベースユーザー名。 | |
CURRENT_USER | STRING | ||
PUBLIC | STRING | AnalyticDB for PostgreSQLインスタンスのすべてのデータベースユーザー名 (後で作成するユーザー名も含む) に一致するパブリックマッピングを作成します。 | |
servername | STRING | 継続する | OSSサーバーの名前。 |
次の表に、OPTIONSに含まれるパラメーターを示します。
パラメーター | データ型 | 必須 | 説明 |
id | STRING | 継続する | OSSバケットへのアクセスに使用されるAccessKey ID。 AccessKey IDの取得方法については、「AccessKeyペアの作成」をご参照ください。 |
キー | STRING | 継続する | OSSバケットへのアクセスに使用されるAccessKeyシークレット。 AccessKeyシークレットの取得方法については、「AccessKeyペアの作成」をご参照ください。 |
例:
CREATE USER MAPPING FOR PUBLIC
SERVER oss_serv
OPTIONS (
id 'LTAI5t7Ge***************',
key 'FikziJd2La*******************'
);
DROP USER MAPPINGステートメントを実行して、ユーザーを削除することもできます。 詳細については、「DROP USER MAPPING」をご参照ください。
OSS外部テーブルの作成
OSSサーバーとサーバーにアクセスするユーザーを作成した後、create FOREIGN TABLEステートメントを実行してOSS外部テーブルを作成できます。 詳細については、「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 | STRING | 継続する | OSS外部テーブルの名前。 |
column_name | STRING | 継続する | 列の名前。 |
data_type | STRING | 継続する | 列のデータ型。 |
次の表に、OPTIONSに含まれるパラメーターを示します。
パラメーター | データ型 | 必須 | 説明 |
ファイルパス | STRING | はい、3つのパラメータの1つ | OSSオブジェクトパスを含むオブジェクト名。 filepathパラメーターが指定されている場合、指定されたオブジェクトのみが選択されます。 |
prefix | STRING | オブジェクトパスのプレフィックス。 指定されたプレフィックスのみが一致し、正規表現はサポートされません。 prefixパラメーターが指定されている場合、名前がプレフィックスで始まるオブジェクトパスに格納されているすべてのOSSオブジェクトが選択されます。 例:
| |
dir | STRING | データオブジェクトが保存されているOSSディレクトリ。 OSSディレクトリはスラッシュ (/) で終わる必要があります。 例: test/mydir/ dirパラメーターが指定されている場合、ディレクトリに格納されているすべてのオブジェクトが選択されます。 | |
バケット | STRING | 継続しない | データオブジェクトを格納するバケットの名前。 バケット名の取得方法については、このトピックの「準備」を参照してください。 説明
|
フォーマット | STRING | 継続する | オブジェクト形式。 有効な値: |
ファイルタイプ | STRING | 継続しない | オブジェクトタイプ。 有効な値:
説明
|
log_errors | BOOLEAN | 継続しない | エラーをログファイルに記録するかどうかを指定します。 デフォルト値:false 詳細については、このトピックの「フォールトトレランス」セクションを参照してください。 説明 このパラメーターは、CSVおよびTEXTオブジェクトに対してのみ有効です。 |
segment_reject_limit | NUMERIC | 継続しない | アボートエラーの数。 パーセント記号 (%) を含む値は、エラー行の割合を示します。 パーセント記号のない値 (%) は、エラー行の数を示します。 例:
説明 このパラメーターは、CSVおよびTEXTオブジェクトに対してのみ有効です。 |
header | BOOLEAN | 継続しない | ソースオブジェクトのフィールドのヘッダー行を含めるかどうかを指定します。 有効な値:
説明 このパラメーターは、CSVオブジェクトに対してのみ有効です。 |
delimiter | STRING | 継続しない | フィールド間の区切り文字。 シングルバイト文字にのみ设定できます。
説明 このパラメーターは、CSVおよびTEXTオブジェクトに対してのみ有効です。 |
quote | STRING | 継続しない | フィールドを囲む引用符。 シングルバイト文字にのみ设定できます。 デフォルト値は二重引用符 (") です。 説明 このパラメーターは、CSVオブジェクトに対してのみ有効です。 |
脱出 | STRING | 継続しない | quoteパラメーターに一致する文字列。 シングルバイト文字にのみ设定できます。 デフォルト値は二重引用符 (") です。 説明 このパラメーターは、CSVオブジェクトに対してのみ有効です。 |
null | STRING | 継続しない | オブジェクト内のNULL文字列の表現。
説明 このパラメーターは、CSVおよびTEXTオブジェクトに対してのみ有効です。 |
encoding | STRING | 継続しない | データオブジェクトのエンコード形式。 デフォルト値: クライアントのエンコード形式。 説明 このパラメーターは、CSVおよびTEXTオブジェクトに対してのみ有効です。 |
force_not_null | BOOLEAN | 継続しない | フィールド値を空の文字列にできないかどうかを指定します。 有効な値:
説明 このパラメーターは、CSVおよびTEXTオブジェクトに対してのみ有効です。 |
force_null | BOOLEAN | 継続しない | 空の文字列を処理するために使用されるメソッド。 有効な値:
説明 このパラメーターは、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 <Name of the OSS foreign table>;
方法 2
SELECT * FROM get_oss_table_meta('<Name of the OSS foreign table>');
DROP FOREIGN TABLEステートメントを実行して、OSS外部テーブルを削除することもできます。 詳細については、「DROP FOREIGN TABLE」をご参照ください。
OSSデータの照会と分析
OSS外部テーブルのデータは、AnalyticDB for PostgreSQLテーブルの場合と同じ方法で照会できます。 次のクエリ方法を使用できます。
キーと値のペアを指定してデータを照会します。
SELECT * FROM ossexample WHERE volume = 5;
集計関数を使用してデータを照会します。
SELECT count(*) FROM ossexample WHERE volume = 5;
列を指定し、GROUP by句とLIMIT句を使用してデータを照会します。
SELECT low, sum(volume) FROM ossexample GROUP BY low ORDER BY low limit 5;
データ分析のためにOSS外部テーブルをAnalyticDB for PostgreSQLテーブルに結合する
結合分析用にexampleという名前のAnalyticDB for PostgreSQLテーブルを作成し、テーブルにデータを挿入します。
CREATE TABLE example (id int, volume int); INSERT INTO example VALUES(1,1), (2,3), (4,5);
OSS外部テーブルossexampleを、データクエリ用のAnalyticDB for PostgreSQLテーブルの例に結合します。
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外部テーブルの作成」をご参照ください。
フォールトトレランスをサポートするOSS外部テーブルを作成します。
CREATE FOREIGN TABLE oss_error_sales (id int, value float8, x text) SERVER oss_serv OPTIONS (log_errors 'true', -- Record the information of error rows. segment_reject_limit '10', -- Specify the threshold to stop scanning. If the number of error rows exceeds 10, the scanning stops. dir 'error_sales/', -- Specify the OSS object directory that the foreign table matches. format 'csv', -- Specify CSV as the format to parse objects. encoding 'utf8'); -- Specify the encoding format.
エラー行のログを照会します。
SELECT * FROM gp_read_error_log('oss_error_sales');
エラー行のログを削除します。
SELECT gp_truncate_error_log('oss_error_sales');
よくある質問
Q: OSS外部テーブルからデータを削除すると、OSSに保存されているデータも削除できますか?
A: いいえ。OSS外部テーブルからデータを削除すると、OSSに保存されているデータは削除できません。