ソース・ファイル・パーティション化を使用した外部表について
Autonomous AI Databaseでは、Hiveスタイルのパーティション・データまたはクラウド・オブジェクト・ストアに格納されている単純なフォルダ・パーティション・データから、パーティション化された外部表を作成できます。
ソース・ファイルのパーティション化を使用して、完全なパーティション指定を指定するかわりに、プロシージャは特定のファイル・パターンのファイル・パスからパーティション化情報を導出します。たとえば、次のデータファイル指定について考えてみます。
-
Hiveスタイル: 例:
sales/country=USA/year=2020/month=01/file 1.csv -
単純なフォルダ・パーティション化スタイル: 例:
sales/USA/2020/01/file1.parquet
これらの一般的なパーティション化形式のいずれかを使用すると、パーティション化された外部表の作成と管理が大幅に簡略化されます。また、データファイルにパーティション列が表示されない場合でも、SQLを使用して問い合せることができます。データをパーティション化すると、スキャンされるデータの量が大幅に削減され、問合せのパフォーマンスも向上します。この例では、USAデータを問い合せると、問合せで他の国のファイルのスキャンをスキップできます。
クラウド・オブジェクト・ストア内のHiveフォーマット・パーティション・データ
Hiveには、ビッグ・データ処理エンジン用の標準メタデータ形式が用意されています。Hive形式で生成されたクラウド・オブジェクト・ストア内のパーティション化されたデータは、folder/subfolder形式で表されます。たとえば、Cloud Object Storeでは、Hive形式のデータ・ファイルが次のように格納されます。
table/partition1=partition1_value/partition2=partition2_value/data_file.csvHiveパーティション形式で保存されたファイルは、データファイルのパス名にパーティション情報を提供します。データファイルのパス名には、パーティション列名やパーティション列値など、オブジェクトの内容に関する情報が含まれます(データファイルには、パーティション列とその関連値は含まれません)。
たとえば、クラウド・オブジェクト・ストアの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.csvHive形式のパーティション情報には、クラウド・オブジェクト・ストアのデータファイルがcountry、yearおよびmonthでパーティション化されていることが示され、これらのパーティション列の値は、各データファイルのHive形式のパス名内でも指定されます(パス名には、パーティション列の値(country、yearおよびmonth)が含まれます)。
パスの列名は、表定義を簡略化するためにAPIで使用されます。
クラウド・オブジェクト・ストア内の単純なフォルダ形式のパーティション・データ
フォルダ形式で生成されたクラウド・オブジェクト・ストア内のパーティション化されたデータは、Hive形式のパーティション化されたデータと同様にfolder/subfolder形式で表されますが、パスの情報は列値を示し、列名は含まれません。また、フォルダ形式のパーティション化されたデータでは、オブジェクト名で指定されたパーティション順序は重要であり、表の列の順序と一致する必要があります。
たとえば、クラウド・オブジェクト・ストアでは、フォルダ形式のデータ・ファイルが次のように格納されます。
table/partition1_value/partition2_value/*.parquetパスには、パーティション列の値、パーティション列の順序およびデータファイルの両方が含まれます。Autonomous AI 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つのパーティションのデータのみが選択されるため、1つのデータファイルを検索するだけで済むことです。したがって、問合せではfile3.csvファイル(/sales/country=USA/year=2020/month=02/file3.csv)のスキャンのみが必要になります。大量のデータでは、このようなパーティション・プルーニングによってパフォーマンスが大幅に向上します。
標準のOracle AI Database外部表を使用して、パーティション列を問合せまたはパーティション定義で使用するには、データファイル内の列として使用できる必要があります。Autonomous AI Database上の外部パーティション表で使用可能な特別な処理がないと、クラウド・オブジェクト・ストアでHive形式で格納されたデータを使用する場合、データファイルにパーティションを列として含めるようにデータファイルを再生成する必要があるため、これは問題になります。
パーティション化された外部表の作成について
クラウド・オブジェクト・ストアでHive形式で格納された非構造化データを使用し、外部パーティション表を作成する場合、列とそのタイプをソース・ファイルから導出できません。したがって、列とそのデータ型は、column_listパラメータで指定する必要があります。パーティション化された外部表を作成するには、プロシージャDBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEを使用して、次のようにパーティション列とそのタイプを指定します。
-
ファイル・リストのルートは、パス名に
file_uri_listパラメータで指定されます。たとえば、http://.../sales/*です -
列名およびデータ型は、
column_listパラメータで指定します。 -
formatパラメータのオプションpartition_columnsは、パーティション列を指定します。 -
生成されたDLLには、パス名で指定された列が含まれます。
この例では、外部表が作成されると、column_listパラメータにcountry、yearおよびmonth列が追加されます。外部表は、データファイルにない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ソース・ファイル
クラウド・オブジェクト・ストアに格納されているCSVソース・ファイルを含む外部パーティション表をHiveスタイルのフォルダに作成する方法を示します。
ソース・ファイル・リスト:
.../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.csvAPI:
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/file
1.csv
.../sales/USA/2020/01/file2.csv
.../sales/USA/2020/02/file3.csv
.../sales/USA/2020/03/file1.csv
.../sales/FRA/2020/03/file1.csvAPI:
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/file
1.parquet
.../sales/USA/2020/01/file2.parquet
.../sales/USA/2020/02/file3.parquet
.../sales/USA/2020/03/file1.parquet
.../sales/FRA/2020/03/file1.parquetAPI:
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/file
1.parquet
.../sales/USA/2020/01/file2.parquet
.../sales/USA/2020/02/file3.parquet
.../sales/USA/2020/03/file1.parquet
.../sales/FRA/2020/03/file1.parquetAPI:
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の順序も重要です。