Impalaで CREATE TABLE AS SELECT
(以下CTAS)などを使ってParquetファイルを生成する際、SELECT文の結果によってはそれほどデータが大きくならないケースがあるが、デフォルトではクラスタのノードにまたがって分散してデータを生成するため、データが小さくなりすぎてしまう場合がある。
なるべく大きなブロックにまとめておくべきという原則から考えると、あまり望ましいことではない。
しかし、CTAS実行時に、利用するノード数を減らすことで、結果として生成されるファイル数を減らすことができる。
Impalaで利用するノード数は NUM_NODES
オプションで指定できる。
実行例
SET NUM_NODES = 1;
CREATE TABLE table_pq STORED AS PARQUET SELECT * FROM table_orig WHERE col1 = 'hoge';
どういうときに使うべきか?
たとえば、ワーカーノードが10台あるときに、デフォルトのままで生成されるファイルの平均サイズが10MB程度であれば、上記の方法を使ってデータをまとめてもいいだろう。10 * 10 = 100 MB程度のため、1ブロック128MBに収まる計算となる。通常Impalaが取り扱うデータサイズから考えるとあまり頻繁に遭遇することはないだろうが、個人用にフィルタしたデータを別テーブルとして作成する場合に、このようなケースが見られる。
注意
上記の例では1ノードで実行しているので、データのリモート転送量が増えるのはもちろん、実行時間も大幅に伸びてしまう。また、メモリの使用量も大きく増えるため、クエリ失敗のリスクが増大する。利用には細心の注意を払うべきだろう。参考リンクにあるClouderaのドキュメントでは、本番環境では使わないようにとの注意書きが記載されている。