/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

2018/12/04 Hive のマテリアライズドビュー

2019年の手帳を買い、12月から使おうと予定を書き込んで数日使っていたところ、2018年ではなく2019年の12月にずっと書き込んでいることに気づきました。無印の手帳なのですがウィークリーに「年」が付いていないので気づきませんでした。。買い換えるのももったいないのでこのまま使おうと思いますが、知り合いの先生が30年ぶりに出勤場所を間違えた(その先生は曜日によって出勤場所が違う)とこの前話していて、12月に入ると注意力が落ちるのだろうかとふと思いました。

Hive の VIEW について

"VIEW" だと非常に検索しづらいですが、CREATE VIEW して作成される論理的で物理的なデータを持たないテーブルのことです。作り方や使い方は MySQL などとほぼ同様だと思います。MySQL でどうだったかは忘れたのですが、Hive の VIEW は作成された後は元となったテーブルが存在するか、スキーマが変更されていないかはチェックしないので、参照時(実行時)にクエリが失敗することがあるようです。

LanguageManual DDL - Apache Hive - Apache Software Foundation

Hive では 3.0.0 から materialized view(マテリアライズドビュー、マテビューとも言うらしい) が導入されています。

Materialized views - Apache Hive - Apache Software Foundation

これは事前にクエリの一部を計算しておくことで、クエリ全体の実行速度を向上させる技術とのこと。クエリ結果は Hive 内の他、Druid 内にも保存できるようです。

元のテーブルが更新された場合、 REBUILD コマンドを実行することでマテビューのデータも更新されます。これは自動では発行されず、ユーザが自ら行う必要があります(一定時間ごとでよいなら、 hive.materializedview.rewriting.time.window というオプションがありました)。この際、差分更新(incremental rebuild) が可能であればそうするとのことで、以下の条件が満たされた場合に差分更新が実行されます:

  • "micromanaged" か "ACID" テーブルしか利用していない
  • GROUP BY 句を含む場合、マテリアライズドビュー自体も ACID テーブルとして保存しなければいけない(Scan-Project-Filter-Join のみからなるマテリアライズドビューの場合はこの制約はない)

ACID テーブルについてはこちらで紹介されていました。行単位での更新を可能にするための技術として明示的に ACID と呼んでいるようです:

www.slideshare.net

1つめの条件内に "micromanaged" とありますが、これは ACID テーブルで INSERT のみを許可するものを指すようです。Hive としては ACID テーブルを 2つ用意していて、INSERT, UPDATE, DELETE ができる full transactional tables, INSERT しか許可しない insert only tables (micromanaged) のどちらかを利用していればマテリアライズドビューが差分更新になるようです。