AnalyticDB for PostgreSQLでは、OSS外部テーブル (gpossext) 機能を使用して、OSS (Object Storage Service) にデータを並行してエクスポートできます。 AnalyticDB for PostgreSQLは、OSS外部テーブルのGZIP圧縮もサポートしており、ファイルサイズとストレージコストを削減します。
gpossextの概要
gpossextは、ファイルがGZIPパッケージで圧縮されているかどうかに関係なく、TEXTおよびCSVファイルからデータを読み書きできます。
次の図は、gpossextアーキテクチャを示しています。
テキストとCSV形式
次のパラメーターは、OSSから読み書きされるファイルの形式を指定します。 外部テーブルのDDLパラメーターでパラメーターを指定できます。
\n
: TEXTまたはCSVファイルの行区切り文字として使用される文字。DELIMITER: 列の区切り文字。
DELIMITERパラメーターを指定する場合は、QUOTEパラメーターも指定する必要があります。
推奨される列区切り文字には、コンマ (
,
) 、縦棒 (|
) 、および\t
などの特殊文字が含まれます。
QUOTE: 特殊文字を含むユーザーデータの各列を囲みます。
特殊文字を含む文字列は、ユーザーデータとコントロール文字を区別するためにQUOTE文字で囲む必要があります。
効率を向上させるために、整数などのデータをQUOTE文字で囲まないことをお勧めします。
QUOTE文字はDELIMITERで指定した文字と同じにすることはできません。 QUOTEのデフォルト値は、二重引用符 ("") のペアです。
QUOTE文字を含むユーザーデータには、ユーザーデータとマシンコードを区別するためにESCAPE文字も含める必要があります。
ESCAPE: エスケープ文字。
エスケープする必要がある特殊文字の前にエスケープ文字を配置して、特殊文字ではないことを示します。
ESCAPEのデフォルト値はQUOTEのデフォルト値と同じです。
バックスラッシュ (
\
) などの他の文字をESCAPE文字として使用することもできます。
表 1 TEXTおよびCSVファイルのデフォルトのコントロール文字
コントロール文字 | テキスト | CSV |
DELIMITER | \t (タブ) | , (コンマ) |
QUOTE | "(二重引用符) | "(二重引用符) |
ESCAPE | 非該当 | "(二重引用符) |
NULL | \N (バックスラッシュn) | 引用符なしの空の文字列 |
制御文字はすべて半角文字でなければなりません。
使用上の注意
外部テーブルの作成と使用に使用される構文は、場所関連のパラメーターの構文を除いて、Greenplum Databaseの構文と同じです。
データのインポートとエクスポートのパフォーマンスは、AnalyticDB for PostgreSQLインスタンスのOSSパフォーマンスとリソース (CPU、I/O、メモリ、ネットワークリソースなど) によって異なります。 インポートとエクスポートのパフォーマンスを最大化するには、テーブルの作成時に列指向のストレージと圧縮を使用することをお勧めします。 たとえば、次の句を指定できます。
"WITH (APPENDONLY=true, ORIENTATION=column, COMPRESSTYPE=zlib, COMPRESSLEVEL=5, BLOCKSIZE=1048576)"
詳細については、「CREATE TABLE」をご参照ください。インポートとエクスポートのパフォーマンスを確保するには、OSSバケットとAnalyticDB for PostgreSQLインスタンスが同じリージョンにある必要があります。
手順
OSS外部テーブル拡張機能を作成します。
OSS外部テーブルを使用する前に、まずAnalyticDB for PostgreSQLでOSS外部テーブル拡張機能を作成する必要があります。 アクセスするデータベースごとに拡張機能を作成します。 次のステートメントを実行して、拡張子を作成します。
CREATE EXTENSION IF NOT EXISTS oss_ext;
で書き込み可能な外部テーブルを作成します。AnalyticDB for PostgreSQL.
次のステートメントを実行して、書き込み可能な外部テーブルを作成します。
CREATE WRITABLE EXTERNAL TABLE table_name ( column_name data_type [, ...] | LIKE other_table ) LOCATION ('ossprotocol') FORMAT 'TEXT' [( [DELIMITER [AS] 'delimiter'] [NULL [AS] 'null string'] [ESCAPE [AS] 'escape' | 'OFF'] )] | 'CSV' [([QUOTE [AS] 'quote'] [DELIMITER [AS] 'delimiter'] [NULL [AS] 'null string'] [FORCE QUOTE column [, ...]] ] [ESCAPE [AS] 'escape'] )] [ ENCODING 'encoding' ] [ DISTRIBUTED BY (column, [ ... ] ) | DISTRIBUTED RANDOMLY ] ossprotocol: oss://oss_endpoint [prefix=prefix_name|dir=[folder/[folder/]...]/file_name] id=userossid key=userosskey bucket=ossbucket compressiontype=[none|gzip] async=[true|false]
下表に、各パラメーターを説明します。
パラメーター
説明
WRITABLE
データエクスポート用の外部テーブルのキーワード。 外部テーブルを作成するときに、このキーワードを指定する必要があります。
FORMAT
サポートされているファイル形式 (TEXTやCSVなど) 。
ENCODING
UTF-8など、ファイル内のデータをエンコードするために使用される形式。
DISTRIBUTED BY
配布キーに基づいて、コンピューティングノードからOSSにデータを書き込む句。
oss://oss_endpoint
プロトコル名: // OSS_endpoint
形式のossのエンドポイントURL。 プロトコル名はossで、oss_endpointはリージョン内のOSSへのアクセスに使用されるドメイン名です。 例:oss://oss-cn-hangzhou.aliyuncs.com
重要Alibaba CloudサーバーからAnalyticDB for PostgreSQLインスタンスにアクセスする場合は、インターネットトラフィックの生成を回避するために内部エンドポイントを使用します。 内部エンドポイントには、
internal
キーワードが含まれます。id
Alibaba CloudアカウントのAccessKey ID。 AccessKeyペアの取得方法については、「AccessKeyペアの作成」をご参照ください。
key
Alibaba CloudアカウントのAccessKeyシークレット。 AccessKeyペアの取得方法については、「AccessKeyペアの作成」をご参照ください。
bucket
データファイルをエクスポートするバケット。 データをエクスポートする前に、OSSバケットを作成する必要があります。
prefix
OSSオブジェクトパスのプレフィックス。 正規表現はサポートされていません。
説明prefixパラメーターとdirパラメーターのいずれかのみを指定できます。
データのエクスポートに書き込み可能な外部テーブルを使用すると、このパラメーターに基づいて、エクスポートされたファイルごとに一意の名前が生成されます。
たとえば、このパラメーターをosstest/exp/outfromhdbに設定した場合、ファイルはosstest/exp/ パスにエクスポートされ、エクスポートされたすべてのファイルの名前はoutfromhdbで始まります。
dir
データオブジェクトを格納するOSSディレクトリ。
説明prefixパラメーターとdirパラメーターのいずれかのみを指定できます。
ディレクトリのパスはスラッシュ (
/
) で終わる必要があります。 例:test/mydir/
データエクスポート用の外部テーブルを作成するときにこのパラメーターを使用すると、すべてのデータが指定されたディレクトリ内の複数のファイルとしてエクスポートされます。 エクスポートされたファイルの名前は、
filename.x
形式です。xは数値を示します。 xの値は連続していなくてもよい。
compressiontype
エクスポートされたファイルの圧縮形式。 有効な値:
none (デフォルト): ファイルは圧縮されていません。
gzip: ファイルはGZIP形式で圧縮されています。
説明GZIP形式のみがサポートされています。
num_parallel_ワーカー
OSSに書き込まれるデータの並列圧縮スレッドの数。 有効値: 1~8。 デフォルト値: 3。 例:
num_parallel_worker=3
oss_flush_block_サイズ
OSSに書き込まれる各データブロックのサイズ。 有効な値: 1 ~ 128 デフォルト値: 32。 単位:MB。 例:
oss_flush_block_size=32
oss_file_max_サイズ
OSSに書き込まれる各ファイルの最大サイズ。 制限を超えると、後続のデータは別のファイルに書き込まれます。 有効値: 8 ~ 4000 デフォルト値: 1024。 単位:MB。 例:
oss_file_max_size=1024
oss_connect_timeout
接続タイムアウト期間。 デフォルト値は 10 です。 単位は秒です。
oss_dns_cache_timeout
DNS解決のタイムアウト期間。 デフォルト値: 60。 単位は秒です。
oss_speed_limit
1秒あたりに送信されるデータの最小量。 1秒あたりに送信されるデータ量が、特定の期間に指定された値よりも少ない場合、タイムアウトがトリガーされます。 単位はバイトです。 デフォルト値: 1024。 1024バイトは1 KBに等しい。
このパラメーターを設定する場合は、oss_speed_timeパラメーターも設定する必要があります。
説明oss_speed_limitおよびoss_speed_timeパラメーターにデフォルト値が使用されているときに、15秒間連続で伝送速度が1 KB/sより低い場合、タイムアウトが発生します。 詳細については、次をご参照ください: エラー処理
oss_speed_time
最小伝送速度を許容することができる最大期間。 送信レートが指定された期間の間指定された値より低い場合、タイムアウトがトリガーされます。 デフォルト値: 15。 単位は秒です。
このパラメーターを設定する場合は、oss_speed_limitパラメーターも設定する必要があります。
説明oss_speed_limitおよびoss_speed_timeパラメーターにデフォルト値が使用されているときに、15秒間連続で伝送速度が1 KB/sより低い場合、タイムアウトが発生します。 詳細については、次をご参照ください: エラー処理
データを並列にエクスポートします。
AnalyticDB for PostgreSQLデータベースで次のステートメントを実行して、データをOSSに並行してエクスポートします。
INSERT INTO <External table> SELECT * FROM <Source table>
例:
この例では、exampleという名前のソーステーブルのデータがOSSにエクスポートされます。
次のステートメントを実行して、OSS外部テーブル拡張機能を作成します。
CREATE EXTENSION IF NOT EXISTS oss_ext;
次のステートメントを実行して、エクスポートするデータを格納するexampleという名前のテーブルを作成します。
CREATE TABLE example (date text, time text, open float, high float, low float, volume int) DISTRIBUTED BY (date);
データがエクスポートされるOSS外部テーブルを作成します。
prefixパラメーターを使用してテーブルのパスを指定する場合は、次のステートメントを実行します。
CREATE WRITABLE EXTERNAL TABLE ossexample_exp (date text, time text, open float, high float, low float, volume int) location('oss://oss-cn-hangzhou.aliyuncs.com prefix=osstest/exp/outfromhdb id=XXX key=XXX bucket=testbucket') FORMAT 'csv' DISTRIBUTED BY (date);
dirパラメーターを使用してテーブルのパスを指定する場合は、次のステートメントを実行します。
CREATE WRITABLE EXTERNAL TABLE ossexample_exp (date text, time text, open float, high float, low float, volume int) location('oss://oss-cn-hangzhou.aliyuncs.com dir=osstest/exp/ id=XXX key=XXX bucket=testbucket') FORMAT 'csv' DISTRIBUTED BY (date);
次のステートメントを実行して、サンプルテーブルからOSSにデータを並行してエクスポートします。
INSERT INTO ossexample_exp SELECT * FROM example;
次のクエリプランを実行します。これは、各コンピュートノードがデータを再配布せずに直接OSSにデータをエクスポートすることを示します。
EXPLAIN INSERT INTO ossexample_exp SELECT * FROM example;
次の情報が返されます。
QUERY PLAN
---------------------------------------------------------------
Insert (slice0; segments: 3) (rows=1 width=92)
-> Seq Scan on example (cost=0.00..0.00 rows=1 width=92)
(2 rows)
SDKのトラブルシューティング
インポートまたはエクスポートプロセス中にエラーが発生した場合、エラーログには次の情報が含まれます。
code: 失敗したリクエストの HTTP ステータスコード。
error_code: OSSによって返されるエラーコード。
error_msg: OSSから返されるエラーメッセージ。
req_id: 失敗したリクエストのUUID。 問題が解決しない場合は、技術サポートのためにOSSにリクエストUUIDを提供できます。
詳細については、次をご参照ください: エラー応答 oss_extに関連するパラメーターを使用して、タイムアウトに関連するエラーを修正できます。