パーティションテーブル¶
Hive テーブルはパーティション分割できます。なぜなら、特にクエリする列がパーティション分割列である場合、クエリパフォーマンスが向上するからです。これは、データセットの場所に、パーティション分割列の列値ごとに個別のフォルダが存在することを意味します。
Denodo 組み込み MPP は、パーティション分割された Parquet データセットからテーブルを作成し、Hive のフォルダ命名規則に従って``columnName=value, elb_name=abc`` のように命名できます。
.../weblogs/elb_name=abc/elb_response_code=200/…
.../weblogs/elb_name=abc/elb_response_code=404/…
.../weblogs/elb_name=xyz/elb_response_code=200/…
CREATE TABLE IF NOT EXISTS weblogs (
request_timestamp varchar,
request_ip varchar,
request_port integer,
backend_ip varchar,
backend_port integer,
request_processing_time double,
backend_processing_time double,
client_response_time double,
received_bytes bigint,
sent_bytes bigint,
request_verb varchar,
url varchar,
protocol varchar,
elb_name varchar,
elb_response_code varchar)
WITH (
format = 'parquet',
partitioned_by = ARRAY['elb_name', 'elb_response_code'],
external_location = 's3://my_bucket/path/to/folder/'
);
注釈
Hive テーブルのパーティション分割列は、 CREATE TABLE
ステートメントで最後の列にする必要があります。
ただし、パーティションテーブルを作成した後にクエリする場合、返される結果は 0 件です。Hive メタストアは、基盤となるストレージシステムにクエリして、存在するパーティションを検出する必要があります。存在するパーティションを検出するのは、Presto プロシージャ system.sync_partition_metadata(schema_name, table_name, mode)
です。
新しいパーティションにデータを挿入する際、新しいレコードを検出するために sync_partition_metadata
プロシージャを再呼び出しする必要があります。
call system.sync_partition_metadata('default', 'weblogs', 'FULL', true);
Denodo の embedded_mpp データソース では、パーティションテーブルを作成するたびに、透過的に sync_partition_metadata
が呼び出されます。