暗黙的なパーティション化による外部表の問合せ

Autonomous Databaseでは、Hiveスタイルのパーティション化されたデータから、またはクラウド・オブジェクト・ストアに格納されている単純なフォルダのパーティション化されたデータから、暗黙的にパーティション化された外部表を作成できます。

暗黙的なパーティション化を使用した外部表について

Autonomous Databaseでは、DBMS_CLOUD.CREATE_EXTERNAL_TABLEプロシージャを使用して、Hiveスタイルのパーティション化されたデータから、またはクラウド・オブジェクト・ストアに格納されている単純なフォルダのパーティション化されたデータから、暗黙的なパーティション化された外部表を作成します。

DBMS_CLOUD.CREATE_EXTERNAL_TABLEプロシージャを使用して、暗黙的なパーティション化された外部表を作成します。このプロシージャに適切なオプションを渡すことによって、パーティションはソース・データから導出されます。パーティション化された外部表は、パーティション列とその値の実行時検出をサポートします。オブジェクトの追加や削除など、基礎となるオブジェクト・ストア構造の変更の実行時検出では、DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEに必要な追加の同期プロシージャが不要になるため、メンテナンス・プロセスが簡略化されます。これにより、問合せ実行時にデータが最新であることが保証されます。

暗黙的なパーティション化では、Autonomous Databaseは、オブジェクト・ストレージ・ソースの階層ファイル構造に基づいて、表がパーティション化されている列を自動的に決定します。パーティション化スキームを明示的に宣言する必要はありません。暗黙的なパーティション化では、DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEプロシージャを使用してパーティション化された外部表を明示的に定義する必要なく、パーティション表のようなパフォーマンス上の利点が得られます。

暗黙的にパーティション化された外部表は、オブジェクト・ストア内のパーティション化されたオブジェクトに対して次のネーミング・スタイルをサポートしています。

ネーミング・フォーマットの詳細は、ソース・ファイル・パーティション化を使用した外部表についてを参照してください。

DBMS_CLOUD.CREATE_EXTERNAL_TABLEプロシージャを使用すると、暗黙的にパーティション化された外部表を次の方法で作成できます。
  • パーティション列のリストを指定してパーティション・タイプをハイブに設定します。

    この場合、implicit_partition_typehiveに設定され、implicit_partition_columnsはパーティション列のリストを提供します。

    たとえば:

    DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
       table_name        => 'mysales',
       credential_name   => 'mycredential',
       file_uri_list     => 'https://swiftobjectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname/*.parquet',
       column_list       => 'product varchar2(100), units number, country varchar2(100),year (number), month varchar2(2)',
       format            => '{"type":"parquet",
                              "implicit_partition_type":"hive",
                              "implicit_partition_columns":["country","year","month"]}');
  • パーティション列のリストを指定せずに、パーティション・タイプをハイブに設定します。

    この場合、implicit_partition_typehiveに設定され、implicit_partition_columnsは指定されません。パーティション列は、file_uri_listで指定されたパスで'='を検索することで自動的に検出されます。column_nameは'='の左側にあり、値は右側にあります。パスにcolumn_nameが見つからない場合は、エラーがスローされます。

    たとえば:

    DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
       table_name        => 'mysales',
       credential_name   => 'mycredential',
       file_uri_list     => 'https://swiftobjectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname/*.parquet',
       column_list       => 'product varchar2(100), units number, country varchar2(100),year (number), month varchar2(2)',
       format            => '{"type":"parquet", "implicit_partition_type":"hive"');
  • タイプを指定せずにパーティション列のリストを指定します

    この場合、implicit_partition_typeは設定されず、implicit_partition_columnsは列のリストを提供します。

    たとえば:

    DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
       table_name        => 'mysales',
       credential_name   => 'mycredential',
       file_uri_list     => 'https://swiftobjectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname/*.parquet',
       column_list       => 'product varchar2(100), units number, country varchar2(100),year (number), month varchar2(2)',
       format            => '{"type":"parquet",
                              "implicit_partition_columns":["country","year","month"]}');

詳細は、CREATE_EXTERNAL_TABLEプロシージャを参照してください。

Hive形式のソース・ファイル編成を使用した外部暗黙的パーティション・データの問合せ

DBMS_CLOUD.CREATE_EXTERNAL_TABLEプロシージャを使用して、Hiveデータから生成されたオブジェクト・ストアのデータから暗黙的にパーティション化された外部表を作成します。

次の例のサンプル・ソース・ファイルでは、次のネーミング形式を使用します。

OBJBUCKET/<table>/<partcol1>=<value1>/<partcol2>=<value2>/file.parquet

次のサンプル・ソース・ファイルを考えます:

OBJBUCKET/sales/country=USA/year=2024/month=01/sales-2024-01.parquet

OBJBUCKET/sales/country=USA/year=2024/month=02/sales-2024-02.parquet

OBJBUCKET/sales/country=USA/year=2024/month=02/sales-2024-03.parquet

このサンプルHive形式で格納されたデータを使用して暗黙的にパーティション化された外部表を作成するには、次の手順を実行します:

  1. プロシージャDBMS_CLOUD.CREATE_CREDENTIALを使用してオブジェクト・ストアの資格証明を格納します。

    たとえば:

    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'DEF_CRED_NAME',
        username => 'adb_user@example.com',
        password => 'password' );
    END;
    /

    リソース・プリンシパル資格証明を有効にする場合、Oracle Cloud Infrastructure Object Storeにアクセスするための資格証明を作成する必要はありません。詳細は、リソース・プリンシパルを使用したOracle Cloud Infrastructureリソースへのアクセスを参照してください。

    この操作では、暗号化された形式で資格証明がデータベースに格納されます。資格証明名には任意の名前を使用できます。このステップは、オブジェクト・ストアの資格証明を変更しないかぎり1回のみ必要です。資格証明を保存したら、外部表の作成に同じ資格証明名を使用できます。

    様々なオブジェクト・ストレージ・サービスのusernameおよびpasswordパラメータの詳細は、CREATE_CREDENTIALプロシージャを参照してください。

  2. プロシージャDBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEを使用して、暗黙的にパーティション化された外部表をソース・ファイルに作成します。
    この例では、フォーマット・オプションimplicit_partition_columnsが指定されていないため、パーティション列は自動的に検出され、フォーマット・オプションimplicit_partition_typehiveに設定することで暗黙的なパーティション化が有効になります。

    ただし、列のリストが指定されている場合、それらの列はパーティション列として使用され、Autonomous Databaseは列の検出を試行しません。

    パーティション列を検出するために、Autonomous Databaseは、file_uri_listで指定されたパスの先頭から「= 」の検索を開始します。見つかった場合、最後の'/'までの'='の左側部分がカラム(例: "country")として、最初の'/'が値(例: "USA")として取得されます。最初のパーティション値に続く'/'の後、パス内の2番目の'='などまで、'='の検索が続行されます。

    DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
       table_name        => 'mysales',
       credential_name   => 'DEF_CRED_NAME',
       file_uri_list     => 'https://swiftobjectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname/*.parquet',
       column_list       => 'product varchar2(100), units number, country varchar2(100),year (number), month varchar2(2)',
       format            => '{"type":"parquet", "implicit_partition_type":"hive"');

    パラメータは次のとおりです:

    • table_name: 外部表の名前です。

    • credential_name: 前のステップで作成された資格証明の名前です。

    • file_uri_list: ソース・ファイルURIのカンマ区切りリストです。このリストには2つのオプションがあります:

      • ワイルドカードを使用しない個々のファイルURIのカンマ区切りリストを指定します。

      • ワイルドカードを含む単一のファイルURIを指定します(ワイルドカードは最後のスラッシュ"/"の後にのみ指定できます)。文字"*"は複数の文字を表すワイルドカードとして、文字"?"は1つの文字を表すワイルドカードとして使用できます。

    • column_list: 外部表の列名およびデータ型のカンマ区切りリストです。リストには、データ・ファイル内の列と、(file_uri_listで指定されたファイル・パス内の名前の)オブジェクト名から導出された列が含まれます。

      データ・ファイルが構造化ファイル(Parquet、AvroまたはORC)の場合、column_listは必要ありません。

    • format: ソース・ファイルのフォーマットを説明するために指定できるオプションを定義します。implicit_partition_typeオプションは、データ形式タイプをhiveとして指定します。

      ソース・ファイルのデータが暗号化されている場合は、encryptionフォーマット・オプションを指定してデータを復号化します。データの復号化の詳細は、オブジェクト・ストレージからのインポート中のデータの復号化を参照してください。

      詳細は、DBMS_CLOUDパッケージ形式オプションに関する項を参照してください。

    この例では、namespace-stringはOracle Cloud Infrastructureオブジェクト・ストレージ・ネームスペースで、bucketnameはバケット名です。詳細は、オブジェクト・ストレージ・ネームスペースの理解を参照してください。

    パラメータの詳細は、CREATE_EXTERNAL_TABLEプロシージャを参照してください。サポートされるクラウド・オブジェクト・ストレージ・サービスの詳細は、DBMS_CLOUD URI形式を参照してください。

  3. これで、前のステップで作成した外部パーティション表に対して問合せを実行できます。

    Autonomous Databaseは、外部パーティション表のパーティション化情報を利用して、問合せがオブジェクト・ストア内の関連データ・ファイルにのみアクセスするようにします。

    たとえば:

    SELECT product, units FROM mysales WHERE year='2024' and month='02'

    このSQL文は、2024年02月のパーティションのデータのみを問い合せます。

外部暗黙的パーティション非Hiveスタイル・データの問合せ

DBMS_CLOUD.CREATE_EXTERNAL_TABLEプロシージャを使用して、Hive以外のデータから生成されたオブジェクト・ストレージのデータから暗黙的にパーティション化された外部表を作成します。

次の例のサンプル・ソース・ファイルでは、次のネーミング形式を使用します。

OBJBUCKET/<table>/<value1>/<value2>/file.parquet

次のサンプル・ソース・ファイルを考えます:

OBJBUCKET/sales/USA/2024/01/sales-2024-01.parquet

OBJBUCKET/sales/USA/2024/01/sales-2024-02.parquet

OBJBUCKET/sales/USA/2024/01/sales-2024-03.parquet

このサンプルHive形式で格納されたデータを使用して暗黙的にパーティション化された外部表を作成するには、次の手順を実行します:

  1. プロシージャDBMS_CLOUD.CREATE_CREDENTIALを使用してオブジェクト・ストアの資格証明を格納します。

    たとえば:

    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'DEF_CRED_NAME',
        username => 'adb_user@example.com',
        password => 'password' );
    END;
    /

    リソース・プリンシパル資格証明を有効にする場合、Oracle Cloud Infrastructure Object Storeにアクセスするための資格証明を作成する必要はありません。詳細は、リソース・プリンシパルを使用したOracle Cloud Infrastructureリソースへのアクセスを参照してください。

    この操作では、暗号化された形式で資格証明がデータベースに格納されます。資格証明名には任意の名前を使用できます。このステップは、オブジェクト・ストアの資格証明を変更しないかぎり1回のみ必要です。資格証明を保存したら、外部表の作成に同じ資格証明名を使用できます。

    様々なオブジェクト・ストレージ・サービスのusernameおよびpasswordパラメータの詳細は、CREATE_CREDENTIALプロシージャを参照してください。

  2. プロシージャDBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEを使用して、暗黙的にパーティション化された外部表をソース・ファイル上に作成します。
    この例では、パーティション列にフォーマット・オプションimplicit_partition_columnsを指定することで、暗黙的なパーティション化が有効になります。フォルダ名にはパーティション列が含まれていないため、file_uri_listで指定されたパスのパーティション値は、フォーマット・オプションimplicit_partition_columnsで列の明示的なリストが指定されている場合にのみ検出できます。パス内のそれぞれの列値を検出するには、列の順序が値の順序と同じである必要があります。

    パーティション列が自動的に検出されます。
    DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
       table_name        => 'mysales',
       credential_name   => 'DEF_CRED_NAME',
       file_uri_list     => 'https://swiftobjectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname/*.parquet',
       column_list       => 'product varchar2(100), units number, country varchar2(100),year (number), month varchar2(2)',
       format            => '{"type":"parquet", "implicit_partition_columns":["country","year","month"]}');

    パラメータは次のとおりです:

    • table_name: 外部表の名前です。

    • credential_name: 前のステップで作成された資格証明の名前です。

    • file_uri_list: ソース・ファイルURIのカンマ区切りリストです。このリストには2つのオプションがあります:

      • ワイルドカードを使用しない個々のファイルURIのカンマ区切りリストを指定します。

      • ワイルドカードを含む単一のファイルURIを指定します(ワイルドカードは最後のスラッシュ"/"の後にのみ指定できます)。文字"*"は複数の文字を表すワイルドカードとして、文字"?"は1つの文字を表すワイルドカードとして使用できます。

    • column_list: 外部表の列名およびデータ型のカンマ区切りリストです。リストには、データ・ファイル内の列と、(file_uri_listで指定されたファイル・パス内の名前の)オブジェクト名から導出された列が含まれます。

      データ・ファイルが構造化ファイル(Parquet、AvroまたはORC)の場合、column_listは必要ありません。

    • format: ソース・ファイルのフォーマットを説明するために指定できるオプションを定義します。implicit_partition_typeオプションは未設定です。implicit_partition_columnsが指定されているため、型は自動的に非ハイブとして検出されます。

      ソース・ファイルのデータが暗号化されている場合は、encryptionフォーマット・オプションを指定してデータを復号化します。データの復号化の詳細は、オブジェクト・ストレージからのインポート中のデータの復号化を参照してください。

      詳細は、DBMS_CLOUDパッケージ形式オプションに関する項を参照してください。

    この例では、namespace-stringはOracle Cloud Infrastructureオブジェクト・ストレージ・ネームスペースで、bucketnameはバケット名です。詳細は、オブジェクト・ストレージ・ネームスペースの理解を参照してください。

    パラメータの詳細は、CREATE_EXTERNAL_TABLEプロシージャを参照してください。

    サポートされるクラウド・オブジェクト・ストレージ・サービスの詳細は、DBMS_CLOUD URI形式を参照してください。

  3. これで、前のステップで作成した外部パーティション表に対して問合せを実行できます。

    Autonomous Databaseは、外部パーティション表のパーティション化情報を利用して、問合せがオブジェクト・ストア内の関連データ・ファイルにのみアクセスするようにします。

    たとえば:

    SELECT product, units FROM mysales WHERE year='2024'

    このSQL文は、2024年のパーティションのデータのみを問い合せます。