X

Big Data、Data Integration、Data Lakeに関するテクノロジー、製品・サービス情報、セミナー情報などをお届けします

Big Data SQL - Partition Pruning

パーティションはデータウェアハウスやあらゆる種類のデータベースで共通のテクニックです。読者の皆さんはパーティションとは何か?ということはよくご存知だと思うので割愛します。必要に応じてOracle RDBMSの例を参照下さい。

Hiveパーティション

Hiveは元々HDFS上にMapReduceでWriteするための簡単な方法として開発されました。HDFSはファイルシステムで、Linuxライクな構造を持ちます。従って、パーティションと見なすのはとても簡単で、サブディレクトリにするだけです。ここで2つの表を挙げます。大きなファクト表:STORE_SALESと、小さなディメンジョン表:DATE_DIMです。それらは以下の関係を持ちます。

 

ファクト表(STORE_SALES)は明確な時刻識別子は持たないが、ディメンジョン(dictionary)との関係性がありDATA_DIM表で明確にデータ定義されています (d_domは日、d_moyは月、d_yearは年)。ではパーティション化されたSTORE_SALES表を作成しましょう。

SQL> CREATE TABLE store_sales_part(
  ss_sold_date_sk bigint,
...
  ss_net_profit double)
  partitioned by (
  yearINT,
  month INT,
  day INT)
stored as ORC;

上の文は3つの仮想列(YEAR, MONTH, DAY)を持つパーティション表を作成しています。データをこのHive表に入れる前に、ダイナミックパーティショニングに必要な、いくつかのパラメータを追加します。

 

hive> SET hive.exec.dynamic.partition=true;
hive> SET hive.exec.dynamic.partition.mode=nonstrict;
hive> SET hive.exec.max.dynamic.partitions =10000;
hive> INSERT INTO TABLE store_sales_part PARTITION (year, month, day)
hive> SELECT store_sales.*, dt.d_year, dt.d_moy, dt.d_dom  
FROM  store_sales, date_dim dt
WHERE
dt.d_date_sk = store_sales.ss_sold_date_sk;  

 

INSERT後、HDFS上でどのように分散されているかを確認します。

$ hadoop fs -du -h /user/hive/warehouse/orc.db/store_sales_part/*/*/|tail -2
168.5 M  505.5 M  /user/hive/warehouse/orc.db/store_sales_part/year=2005/month=9/day=8
168.7 M  506.0 M  /user/hive/warehouse/orc.db/store_sales_part/year=2005/month=9/day=9

 

新しいパーティション表:STORE_SALES_PARTは3つの仮想列を持ち、仮想列は実際Disk上には格納されないが(=Disk上のスペースを取らないが)、不必要なIOを避けるのに使うことができます。さらに、これらの列はHIVEコンソールから問い合わせることができます。

 

hive> select ss_sold_date_sk, year, month, day from store_sales_part limit 2;
OK
36890   2001    1       1
36890   2001    1       1

 

Great! ではOracle RDBMSの番、このHive表にリンクされたテーブルを作成します。

SQL>  CREATE TABLE STORE_SALES_ORC_PART
  (SS_SOLD_DATE_SK NUMBER(10,0),
   ....
   SS_NET_PROFIT BINARY_DOUBLE,
   YEAR NUMBER,
   MONTH NUMBER,
   DAY NUMBER)
 ORGANIZATION EXTERNAL    
(TYPE ORACLE_HIVE      
DEFAULT DIRECTORY DEFAULT_DIR    
ACCESS PARAMETERS    
 ( com.oracle.bigdata.cluster=bds30   
 com.oracle.bigdata.tablename=orc.store_sales_part) )
  REJECT LIMIT UNLIMITED  
PARALLEL;

Oracleの外部表として、パーティションプルーニングできる表が作成できました。このことを確かめてみましょう。パーティションキーでのPredicateが無いクエリを実行します。

SQL> SELECT COUNT(1) FROM STORE_SALES_ORC_PART;

実行後、統計値を確認します。

SQL> SELECT   n.name,  round(s.value / 1024 / 1024 / 1024)  
FROM v$mystat   s, v$statname n
WHERE s.statistic# = 462  
AND s.statistic# = n.statistic#;
--------------------------------------------
cell XT granule bytes requested for predicate offload         298  

ディレクトリのサイズを確認してみます。

$ hadoop fs -du -h -s /user/hive/warehouse/orc.db/store_sales_part/
297.8 G  893.5 G  /user/hive/warehouse/orc.db/store_sales_part

ディレクトリサイズは298GBで、上の統計値に合致します。全ては正しく動いていますね。

では、特定の年に絞ったクエリを実行します。

SQL> SELECT COUNT(1) FROM STORE_SALES_ORC_PART WHERE YEAR=2004;

データベースの統計値を確認します。

SQL> SELECT   n.name,  round(s.value / 1024 / 1024 / 1024)  
FROM v$mystat   s, v$statname n
WHERE s.statistic# = 462  
AND s.statistic# = n.statistic#;
--------------------------------------------
cell XT granule bytes requested for predicate offload         60

HDFS上のファイルサイズを確認し比較します。

$ hadoop fs -du -h -s /user/hive/warehouse/orc.db/store_sales_part/year=2004
60.3 G  893.5 G  /user/hive/warehouse/orc.db/store_sales_part

60GB分だけREADしていることが分かります。

しかし最も興味深いのは、サブパーティションでもフィルタできることです。例えば、全ての年の12月のデータだけ欲しいとします。次のように、12月パーティションだけREADします:

SQL> SELECT COUNT(1) FROM STORE_SALES_ORC_PART WHERE MONTH=12;

データベースの統計値を確認します。

SQL> SELECT   n.name,  round(s.value / 1024 / 1024 / 1024)  
FROM v$mystat   s, v$statname n
WHERE s.statistic# = 462  
AND s.statistic# = n.statistic#;
--------------------
cell XT granule bytes requested for predicate offload         23

素晴らしいことに、HDFS上のデータサイズの合計値とぴったり一致します。

$ hadoop fs -du -h -s /user/hive/warehouse/orc.db/store_sales_part/*/month=12
5.1 G  15.3 G  /user/hive/warehouse/orc.db/store_sales_part/year=2001/month=12
5.1 G 15.3 G/user/hive/warehouse/orc.db/store_sales_part/year=2002/month=12
5.1 G  15.3 G  /user/hive/warehouse/orc.db/store_sales_part/year=2003/month=12
5.1 G  15.3 G  /user/hive/warehouse/orc.db/store_sales_part/year=2004/month=12
2.1 G  6.3 G  /user/hive/warehouse/orc.db/store_sales_part/year=2005/month=12

シンプルだがパワフルな機能です!

 

本投稿は Big Data SQL Quick Start. Partition Pruning - Part7. を元に投稿しています。

 

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.