ソース・ファイル・パーティション化による外部表について
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形式のパーティション情報には、クラウド・オブジェクト・ストアのデータ・ファイルがcountry
、year
およびmonth
でパーティション化され、これらのパーティション列の値は、各データ・ファイルのHive形式のパス名内にも指定されます(パス名にはパーティション列の値が含まれます): country
、year
およびmonth
)。
パスの列名は、APIによって表定義を簡略化するために使用されます。
クラウド・オブジェクト・ストア内のシンプルなフォルダ形式パーティション・データ
フォルダ形式で生成されたクラウド・オブジェクト・ストア内のパーティション・データはfolder/subfolder
形式で表され、Hive形式のパーティション・データと同様ですが、パス内の情報は列値を示し、列名は含まれません。 また、フォルダ形式のパーティション・データでは、オブジェクト名で指定されたパーティション順序は重要であり、表の列の順序と一致する必要があります。
たとえば、クラウド・オブジェクト・ストアでは、フォルダ形式のデータ・ファイルが次のように格納されます:
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
値とmonth
およびyear
の期間値は、データ・ファイル内の列として指定されません。 パーティション列の値は、表示される値があるパス名でのみ指定されます: 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には、パス名で指定された列が含まれます。
この例では、外部表が作成されると、country
、year
およびmonth
列がcolumn_list
パラメータに追加されます。 外部表は、データ・ファイルにないcountry
列、year
列および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ソース・ファイルを含む外部パーティション表を作成する方法を示します。 - 外部パーティション化: 単純フォルダのあるCSVソース・ファイル
単純なフォルダ形式でクラウド・オブジェクト・ストアに格納されているCSVソース・ファイルを使用して、外部パーティション表を作成する方法を示します。 - 外部パーティション化: Hiveスタイルのフォルダを含むParquetソース・ファイル
Hiveスタイルのフォルダのクラウド・オブジェクト・ストアに格納されたParquetソース・ファイルを使用して、外部パーティション表を作成する方法を示します。 - 外部パーティション化: Parquetと単純フォルダ
単純なフォルダ形式でクラウド・オブジェクト・ストアに格納されたParquetソース・ファイルを使用して、外部パーティション表を作成する方法を示します。
外部パーティション化: 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
パラメータが指定されていません。 パーティション列の名前とデータ型の両方を含める必要があります。 また、列名がファイル・パス内にないため、format句のpartition_columns
の順序は重要です。