ソース・ファイル・パーティション化を使用した外部表について

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

ソース・ファイル・パーティション化を使用すると、完全なパーティション仕様を指定するかわりに、プロシージャにより特定のファイル・パターンのファイル・パスからパーティション化情報が導出されます。たとえば、次のデータ・ファイル仕様について検討してください:

  • Hiveスタイル: 例: sales/country=USA/year=2020/month=01/file1.csv

  • 単純なフォルダ・パーティション化スタイル: たとえば: sales/USA/2020/01/file1.parquet

これらの共通のパーティション形式のいずれかを使用すると、パーティション化された外部表の作成と管理の両方が大幅に簡略化されます。また、パーティション列がデータ・ファイルに表示されない場合でも、SQLを使用して問合せできます。また、データをパーティション化すると、スキャンされるデータの量が大幅に削減されるため、問合せのパフォーマンスが向上します。この例では、'USA'データを問い合せた場合、問合せで他の国のファイルのスキャンをスキップできます。

クラウド・オブジェクト・ストア内のHive形式のパーティション・データ

Hiveは、ビッグ・データ処理エンジン用の標準メタデータ形式を提供します。Hive形式で生成されるクラウド・オブジェクト・ストアのパーティション・データは、folder/subfolder形式で表されます。たとえば、クラウド・オブジェクト・ストアでは、Hive形式のデータ・ファイルは次のように格納されます:

table/partition1=partition1_value/partition2=partition2_value/data_file.csv

Hiveパーティション形式で保存されたファイルは、データ・ファイルのパス名にパーティション情報を提供します。データ・ファイルのパス名には、パーティション列名やパーティション列値など、オブジェクトの内容に関する情報が含まれます(データ・ファイルには、パーティション列および関連する値は含まれません)。

たとえば、クラウド・オブジェクト・ストアのHive形式データから作成された外部パーティション表SALESを考えてみます:

.../sales/country=USA/year=2020/month=01/file1.csv
.../sales/country=USA/year=2020/month=01/file2.csv
.../sales/country=USA/year=2020/month=02/file3.csv
.../sales/country=USA/year=2020/month=03/file1.csv
.../sales/country=FRA/year=2020/month=03/file1.csv

Hive形式のパーティション情報は、クラウド・オブジェクト・ストアのデータ・ファイルがcountryyearおよびmonthでパーティション化されていることを示し、これらのパーティション列の値は、各データ・ファイルのHive形式のパス名内でも指定されます(パス名には、パーティション列の値countryyearおよびmonthが含まれます)。

パス内の列名は、表定義を簡素化するためにAPIで使用されます。

クラウド・オブジェクト・ストア内の単純なフォルダ形式のパーティション・データ

フォルダ形式で生成されるクラウド・オブジェクト・ストアのパーティション・データは、Hive形式のパーティション・データと同様に、folder/subfolder形式で表されますが、パス内の情報には列の値が表示され、列名は含まれません。また、フォルダ形式のパーティション・データでは、オブジェクト名で指定されたパーティションの順序は重要であり、表の列の順序と一致する必要があります。

たとえば、クラウド・オブジェクト・ストアでは、フォルダ形式のデータファイルが次のように格納されます:

table/partition1_value/partition2_value/*.parquet

パスには、パーティション列順序でのパーティション列値とデータ・ファイルの両方が含まれます。Autonomous Databaseでは、フォルダ形式のデータから外部パーティション表を作成でき、指定したパーティションを使用して問合せを実行できます。

フォルダ・パーティション形式で保存されたファイルは、ファイル名にデータ・パーティション列の値を提供します。Hiveとは異なり、パスには列名が含まれないため、列名を提供する必要があります。パーティション列の順序は重要であり、列パーティション名のファイル名の順序はpartition_columnsパラメータの順序と一致する必要があります。

クラウド・オブジェクト・ストアでのパーティション・データの問合せについて

Hive形式の外部パーティション・データを問い合せると、問合せエンジンは、ファイル・パス名からのパーティション化情報を理解して利用します。たとえば、オブジェクト・ストアのソース・ファイルsales/country=USA/year=2020/month=02/file3.csvに次の販売データが含まれる、外部パーティション表SALESについて考えます:

tents, 291
canoes, 22
backpacks, 378

パス名内のcountry値、およびmonthyearの期間値は、データ・ファイル内の列として指定されません。パーティション列の値は、パス名にのみUSA、2020および02の値で指定されます。このデータ・ファイルを使用して外部パーティション表を作成した後、外部パーティション表で問合せを実行すると、パーティション列およびその値を使用できます。

たとえば:

SELECT year, month, product, units 
     FROM SALES WHERE year='2020' AND month='02' AND country='USA'

Hive形式のパーティション・データとして生成されたデータを使用して外部パーティション表を作成する利点は、問合せエンジンがデータをパーティション・プルーニングして正しいパーティションを選択するように最適化されており、問合せでは1つのパーティションのデータのみが選択され、単一のデータ・ファイルのみを検索できることです。したがって、問合せではfile3.csvファイル(/sales/country=USA/year=2020/month=02/file3.csv)のスキャンのみが必要になります。大量データの場合、このようなパーティション・プルーニングによってパフォーマンスが大幅に向上する可能性があります。

標準のOracle Database外部表を使用する場合、問合せまたはパーティション定義にパーティション列を使用するには、そのパーティション列をデータ・ファイル内の列として使用できる必要があります。Autonomous Databaseの外部パーティション表で使用可能な特別な処理がないと、クラウド・オブジェクト・ストアにHive形式で格納されたデータを使用する際に、データ・ファイルにパーティションを含めるようにデータ・ファイルを再生成する必要があるため、これは問題になります。

パーティション化された外部表の作成について

クラウド・オブジェクト・ストアにHive形式で格納された非構造化データを使用し、外部パーティション表を作成する場合、列およびそのタイプをソース・ファイルから導出することはできません。したがって、列およびそのデータ型は、column_listパラメータで指定する必要があります。パーティション化された外部表を作成するには、プロシージャDBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEを使用して、次のようにパーティション列およびそのタイプを指定します:

  • ファイル・リストのルートは、file_uri_listパラメータを使用してパス名で指定されます。例: http://.../sales/*

  • 列名およびデータ型は、column_listパラメータで指定します。

  • formatパラメータのオプションpartition_columnsは、パーティション列を指定します。

  • 生成されたDLLには、パス名で指定された列が含まれます。

この例では、外部表が作成されると、column_listパラメータにcountryyearおよびmonth列が追加されます。外部表は、データ・ファイルにないcountryyearおよびmonth列を使用して作成され、パーティション・プルーニングを有効にするリスト・パーティションが作成されます。

クラウド・オブジェクト・ストアに格納されたParquet、Avro、ORCファイルなどの構造化データを使用すると、列およびそのデータ型が認識され、非構造化データに必要な列リストを指定する必要はありません。パーティション化された外部表を作成するには、プロシージャDBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEを使用して、次のようにパーティション列およびそのタイプを指定します:

  • ファイル・リストのルートは、file_uri_listパラメータを使用してパス名で指定されます。例: http://.../sales/*
  • 構造化ファイルには、column_listパラメータは必要ありません。列リストを指定しない場合は、外部パーティション表の作成時にパーティション列およびそのデータ型を定義する必要があります。パーティション列およびそのデータ型を指定するには、formatパラメータでオプションpartition_columnsを使用します。
  • 生成されたDLLには、パス名で指定された列が含まれます。

完全な例は、Hive形式のソース・ファイル編成を使用した外部パーティション・データの問合せおよびフォルダ形式のソース・ファイル編成を使用した外部パーティション・データの問合せを参照してください。

外部パーティション化: Hiveスタイルのフォルダを使用したCSVソース・ファイル

クラウド・オブジェクト・ストアのHiveスタイルのフォルダに格納されているCSVソース・ファイルを使用して外部パーティション表を作成する方法を示します。

ソース・ファイル・リスト:

.../sales/country=USA/year=2020/month=01/file1.csv
.../sales/country=USA/year=2020/month=01/file2.csv
.../sales/country=USA/year=2020/month=02/file3.csv
.../sales/country=USA/year=2020/month=03/file1.csv
.../sales/country=FRA/year=2020/month=03/file1.csv

API:

DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE (
   table_name        => 'mysales',
   credential_name   => 'mycredential', 
   file_uri_list     => 'https://objectstorage.us-phoenix-1.oraclecloud.com/.../sales/*.csv', 
   column_list       => 'product varchar2(100), units number, country varchar2(100), year number, month varchar2(2)', 
   field_list        => 'product, units', --[Because country, year and month are not in the file, they are not listed in the field list]
   format            => '{"type":"csv","partition_columns":["country", "year", "month"]}');
ノート

formatパラメータのpartition_columnsは、パスで見つかった列名と一致する必要があります(たとえば、country列は"country=..."と一致します)

外部パーティション化: 単純フォルダを使用したCSVソース・ファイル

単純なフォルダ形式でクラウド・オブジェクト・ストアに格納されているCSVソース・ファイルを使用して、外部パーティション表を作成する方法を示します。

ソース・ファイル・リスト:

.../sales/USA/2020/01/file1.csv
.../sales/USA/2020/01/file2.csv
.../sales/USA/2020/02/file3.csv
.../sales/USA/2020/03/file1.csv
.../sales/FRA/2020/03/file1.csv

API:

DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE(
   table_name        => 'mysales',
   credential_name   => 'mycredential', 
   file_uri_list     =>  'https://objectstorage.us-phoenix-1.oraclecloud.com/.../sales/*.csv', 
   column_list       => 'product varchar2(100), units number, country varchar2(100), year number, month varchar2(2)', 
   field_list        => 'product, units', --[Because country, year and month are not in the file, they are not listed in the field list]
   format            => '{"type":"csv","partition_columns":["country", "year", "month"]}');
ノート

APIコールは前の例と同じですが、formatパラメータのpartition_columnsの順序は、列名がファイル・パスにないため重要です。

外部パーティション化: Hiveスタイルのフォルダを使用したParquetソース・ファイル

クラウド・オブジェクト・ストアのHiveスタイルのフォルダに格納されているParquetソース・ファイルを使用して外部パーティション表を作成する方法を示します。

ソース・ファイル・リスト:

.../sales/USA/2020/01/file1.parquet
.../sales/USA/2020/01/file2.parquet
.../sales/USA/2020/02/file3.parquet
.../sales/USA/2020/03/file1.parquet
.../sales/FRA/2020/03/file1.parquet

API:

DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE (
   table_name            => 'mysales',
     credential_name     => 'mycredential', 
     file_uri_list       => 'https://objectstorage.us-phoenix-1.oraclecloud.com/.../sales/*.parquet',
     format              => 
         json_object(    'type' value 'parquet', 
               'schema' value 'first',
               'partition_columns' value 
                  json_array(
                      json_object('name' value 'country', 'type' value 'varchar2(100)'),
                      json_object('name' value 'year', 'type' value 'number'),
                      json_object('name' value 'month', 'type' value 'varchar2(2)')
            )
        )

);
ノート

column_listパラメータは指定されていません。示されているように、パーティション列ごとに、formatパラメータのpartition_columnsに名前とデータ型の両方を指定します。

外部パーティション化: 単純フォルダを使用したParquet

単純なフォルダ形式でクラウド・オブジェクト・ストアに格納されているParquetソース・ファイルを使用して外部パーティション表を作成する方法を示します。

ソース・ファイル・リスト:

.../sales/USA/2020/01/file1.parquet
.../sales/USA/2020/01/file2.parquet
.../sales/USA/2020/02/file3.parquet
.../sales/USA/2020/03/file1.parquet
.../sales/FRA/2020/03/file1.parquet

API:

DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE (
   table_name        => 'mysales',
   credential_name   => 'mycredential', 
   file_uri_list     => 'https://objectstorage.us-phoenix-1.oraclecloud.com/.../sales/*.parquet', 
   format            => 
     json_object(    'type' value 'parquet', 
                'schema' value 'first',
         'partition_columns' value 
           json_array(
              json_object('name' value 'country', 'type' value 'varchar2(100)'),
              json_object('name' value 'year', 'type' value 'number'),
              json_object('name' value 'month', 'type' value 'varchar2(2)')
            )
        )

);
ノート

column_listパラメータは指定されていません。パーティション列の名前とデータ型の両方を含める必要があります。また、列名がファイル・パスに存在しないため、partition_columnsの書式句での順序は重要です。