すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:データレイク分析にOSS外部テーブルを使用する

最終更新日:Sep 27, 2024

このトピックでは、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バケット情報の取得

次の手順では、バケット名オブジェクトパスエンドポイント、およびバケットドメイン名を取得する方法を示します。

  1. OSSコンソール.

  2. 左側のナビゲーションウィンドウで、バケツ.

  3. バケツページで、バケットの名前をクリックします。

    バケット名[バケット] ページで取得できます。

  4. オブジェクト管理ページでオブジェクトパスを取得します。

  5. 左側のナビゲーションウィンドウで、概要.

  6. ポートのセクション概要ページを取得し、エンドポイントおよび対応するバケットドメイン名.

    データアクセスには、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

継続しない

データオブジェクトを格納するバケットの名前。 バケット名の取得方法については、このトピックの「準備」を参照してください。

説明
  • バケットパラメーターは、OSSサーバーとOSS外部テーブルの少なくとも1つに指定する必要があります。 OSS外部テーブルに指定されたバケットパラメーターの詳細については、このトピックの「OSS外部テーブルの作成」をご参照ください。

  • OSSサーバーとOSS外部テーブルの両方にバケットパラメーターが指定されている場合、OSS外部テーブルに指定されたバケットパラメーターが有効になります。

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オブジェクトが選択されます。 例:

  • プレフィックスをtest/filenameに設定すると、次のオブジェクトがインポートされます。

    • test/filename

    • test/filenamexxx

    • test/filename/aa

    • test/filenameyyy/aa

    • test/filenameyyy/bb/aa

  • プレフィックスをtest/filename /に設定すると、前述のオブジェクトのうち次のオブジェクトのみがインポートされます。

    • test/filename/aa

dir

STRING

データオブジェクトが保存されているOSSディレクトリ。 OSSディレクトリはスラッシュ (/) で終わる必要があります。 例: test/mydir/

dirパラメーターが指定されている場合、ディレクトリに格納されているすべてのオブジェクトが選択されます。

バケット

STRING

継続しない

データオブジェクトを格納するバケットの名前。 バケット名の取得方法については、このトピックの「準備」を参照してください。

説明
  • バケットパラメーターは、OSSサーバーとOSS外部テーブルの少なくとも1つに指定する必要があります。

  • OSSサーバーとOSS外部テーブルの両方にバケットパラメーターが指定されている場合、OSS外部テーブルに指定されたバケットパラメーターが有効になります。

フォーマット

STRING

継続する

オブジェクト形式。 有効な値:

  • csv

  • text

  • orc

  • avro

  • 寄木細工

  • JSON

    JSONの詳細については、「JSONの紹介」をご参照ください。

  • jsonline

    この形式では、JSONデータは改行で区切られます。 JSON Linesを使用して読み取ることができるすべてのデータは、JSONを使用して読み取ることもできますが、その逆はできません。 可能であれば、JSONラインを使用することを推奨します。 JSONラインの詳細については、「JSONライン」をご参照ください。

ファイルタイプ

STRING

継続しない

オブジェクトタイプ。 有効な値:

  • plain (デフォルト): システムは生のバイナリデータのみを読み取ります。

  • gzip: システムは生のバイナリデータを読み取り、GZIPを使用してパッケージを解凍します。

  • snappy: システムは生のバイナリデータを読み取り、Snappyを使用してパッケージを解凍します。

    標準のSnappy圧縮オブジェクトのみがサポートされています。 Hadoop Snappy圧縮オブジェクトはサポートされていません。

説明
  • filetypeパラメーターが指定されている場合、CSV、TEXT、JSON、およびJSON Linesオブジェクトのみがサポートされます。

  • filetypeパラメーターがsnappyに設定されている場合、JSONおよびJSON Linesオブジェクトはサポートされません。

log_errors

BOOLEAN

継続しない

エラーをログファイルに記録するかどうかを指定します。 デフォルト値:false 詳細については、このトピックの「フォールトトレランス」セクションを参照してください。

説明

このパラメーターは、CSVおよびTEXTオブジェクトに対してのみ有効です。

segment_reject_limit

NUMERIC

継続しない

アボートエラーの数。

パーセント記号 (%) を含む値は、エラー行の割合を示します。 パーセント記号のない値 (%) は、エラー行の数を示します。 例:

  • segment_reject_limit = '10' は、エラー行の数が10を超えると、スキャンが停止し、エラーメッセージで終了することを示します。

  • segment_reject_limit = '10% 'は、エラー行の割合が処理された行の10% を超えると、スキャンが停止してエラーメッセージで終了することを示します。

説明

このパラメーターは、CSVおよびTEXTオブジェクトに対してのみ有効です。

header

BOOLEAN

継続しない

ソースオブジェクトのフィールドのヘッダー行を含めるかどうかを指定します。 有効な値:

  • true: ヘッダー行を含みます。

  • false (デフォルト): ヘッダー行は含まれません。

説明

このパラメーターは、CSVオブジェクトに対してのみ有効です。

delimiter

STRING

継続しない

フィールド間の区切り文字。 シングルバイト文字にのみ设定できます。

  • CSVオブジェクトのデフォルト値: comma (,)

  • TEXTオブジェクトのデフォルト値: タブキー

説明

このパラメーターは、CSVおよびTEXTオブジェクトに対してのみ有効です。

quote

STRING

継続しない

フィールドを囲む引用符。 シングルバイト文字にのみ设定できます。 デフォルト値は二重引用符 (") です。

説明

このパラメーターは、CSVオブジェクトに対してのみ有効です。

脱出

STRING

継続しない

quoteパラメーターに一致する文字列。 シングルバイト文字にのみ设定できます。 デフォルト値は二重引用符 (") です。

説明

このパラメーターは、CSVオブジェクトに対してのみ有効です。

null

STRING

継続しない

オブジェクト内のNULL文字列の表現。

  • CSVオブジェクトのデフォルト値: \N

  • TEXTオブジェクトのデフォルト値: 引用符で囲まれていない空の文字

説明

このパラメーターは、CSVおよびTEXTオブジェクトに対してのみ有効です。

encoding

STRING

継続しない

データオブジェクトのエンコード形式。 デフォルト値: クライアントのエンコード形式。

説明

このパラメーターは、CSVおよびTEXTオブジェクトに対してのみ有効です。

force_not_null

BOOLEAN

継続しない

フィールド値を空の文字列にできないかどうかを指定します。 有効な値:

  • true: フィールド値を空の文字列にすることはできません。

  • false (デフォルト): フィールド値は空の文字列にすることができます。

説明

このパラメーターは、CSVおよびTEXTオブジェクトに対してのみ有効です。

force_null

BOOLEAN

継続しない

空の文字列を処理するために使用されるメソッド。 有効な値:

  • true: フィールド値が引用符で囲まれているかどうかに関係なく、空の文字列がNULLとして返されます。

  • false (デフォルト): フィールド値が引用符で囲まれていない場合にのみ、空の文字列が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 <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テーブルに結合する

  1. 結合分析用にexampleという名前のAnalyticDB for PostgreSQLテーブルを作成し、テーブルにデータを挿入します。

    CREATE TABLE example (id int, volume int);
    INSERT INTO example VALUES(1,1), (2,3), (4,5);
  2. 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に保存されているデータは削除できません。

関連ドキュメント