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

DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEを使用して、外部パーティション表を作成し、クラウド・オブジェクト・ストアのファイル・パスからパーティション化情報を生成します。

オブジェクト・ストアの次のサンプル・ファイルを考えます:

custsales/month=2019-01/custsales-2019-01.csv

custsales/month=2019-02/custsales-2019-02.csv

custsales/month=2019-03/custsales-2019-03.csv

このネーミングでは、monthの値がオブジェクト名内に取得されます。

このサンプル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を使用して、ソース・ファイルの上に外部パーティション表を作成します。

    プロシージャDBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEは、サポートされているクラウド・オブジェクト・ストレージ・サービスの外部パーティション・ファイルをサポートします。資格証明は表レベルのプロパティであるため、外部ファイルはすべて同じクラウド・オブジェクト・ストアに存在する必要があります。

    たとえば、次のとおりです。

    BEGIN
        DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE(
            TABLE_NAME => 'sales_sample',
            CREDENTIAL_NAME => 'DEF_CRED_NAME',
            FILE_URI_LIST => 'https://objectstorage.us-ashburn-1.oraclecloud.com/n/namespace-string/b/moviestream_landing/o/sales_sample/*.parquet',
            FORMAT => '{"type":"parquet", "schema": "first","partition_columns":[{"name":"month","type":"varchar2(100)"}]}');
    END;
    /

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

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

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

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

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

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

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

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

    • format: ソース・ファイルのフォーマットを説明するために指定できるオプションを定義します。partition_columns formatパラメータは、パーティション列の名前を指定します。

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

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

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

    DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEコールにより、次のテーブル定義が生成されます:

    CREATE TABLE "ADMIN"."SALES_SAMPLE"
       ( "DAY_ID" TIMESTAMP (6),
          "GENRE_ID" NUMBER(19,0),
          "MOVIE_ID" NUMBER(19,0),
          "CUST_ID" NUMBER(19,0),
          "APP" VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP",
          "DEVICE" VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP",
          "OS" VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP",
          "PAYMENT_METHOD" VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP",
          "LIST_PRICE" BINARY_DOUBLE,
          "DISCOUNT_TYPE" VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP",
          "DISCOUNT_PERCENT" BINARY_DOUBLE,
          "ACTUAL_PRICE" BINARY_DOUBLE,
          "MONTH" VARCHAR2(100 BYTE) COLLATE "USING_NLS_COMP"
       ) DEFAULT COLLATION "USING_NLS_COMP"
       ORGANIZATION EXTERNAL
        ( TYPE ORACLE_BIGDATA
          DEFAULT DIRECTORY "DATA_PUMP_DIR"
          ACCESS PARAMETERS
          ( com.oracle.bigdata.fileformat=parquet
    com.oracle.bigdata.filename.columns=["month"]
    com.oracle.bigdata.file_uri_list="https://objectstorage.us-ashburn-1.oraclecloud.com/n/namespace-string/b/moviestream_landing/o/sales_sample/*.parquet"
    com.oracle.bigdata.credential.schema="ADMIN"
    com.oracle.bigdata.credential.name=CRED_OCI
    com.oracle.bigdata.trimspaces=notrim
      )
        )
       REJECT LIMIT 0
      PARTITION BY LIST ("MONTH")
     (PARTITION "P1" VALUES (('2019-01'))
          LOCATION
           ( 'https://objectstorage.us-ashburn-1.oraclecloud.com/n/namespace-string/b/moviestream_landing/o/sales_sample/month=2019-01/*.parquet'
           ),
     PARTITION "P2" VALUES (('2019-02'))
          LOCATION
           ( 'https://objectstorage.us-ashburn-1.oraclecloud.com/n/namespace-string/b/moviestream_landing/o/sales_sample/month=2019-02/*.parquet'
           ))
      PARALLEL ;

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

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

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

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

    次に例を示します。

    SELECT movie_id, month FROM sales WHERE month='2019-02'

    DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEを使用して作成する外部パーティション表には、2つの非表示列file$pathおよびfile$nameが含まれます。これらの列は、レコードの取得元ファイルの識別に役立ちます。詳細は、外部表のメタデータ列を参照してください。

指定したフォーマット・オプションに一致しない行がソース・ファイル内にある場合、問合せはエラーを報告します。これらのエラーを抑制するには、rejectlimitなどのDBMS_CLOUDパラメータを使用できます。または、作成した外部パーティション表を検証し、エラー・メッセージと拒否された行を確認して、それに従ってフォーマット・オプションを変更することもできます。詳細は、外部データの検証および外部パーティション・データの検証を参照してください。