HiveとImpalaのネストしたカラムのpushdown(行や列方向のフィルタ)に関するまとめ

f:id:yassan0627:20190107065817p:plain

結論

2019/01/07時点で Hive または Impala において、ネストしたカラムに対するpushdownは対応が済んでいない。

きっかけ

CDH5.14にて、Hiveのクエリが激遅いって事で、実行計画見て、これpushdown出来てないんじゃね?って事で調べる事にした。

っと、ありがたい事に回答頂いていたのですが、この辺きっかけで自分でも調べてみた。

Pushdownについて

HDFS上からSQLライクにデータを取り出すには、HiveやImpalaを使うのですが(他にも PrestoとかDrillとかもあるけど)、
でかいテーブルでフルスキャンするとデータ量が半端なくなるので、特定のカラムだけとか、特定の行だけと、フィルタして取り出します。

その辺りのフィルタの事をPushdownと言います。
Pushdownについては、以下のスライド及びBlogが参考になります。

www.koyamada-numazu.com

また、Hive及びImpalaには、1カラムに複数の値を保持できる Complex型と呼ばれる型が存在します。
そして、Complex型には、Array、Struct、Mapがあります。

cf. Hive - Complex Types
cf. Impala - Complex Types

今回は、PostgreSQLMySQLで言うところのJSON型の様に扱える Struct型に絞った話。 Struct型を使うことで、アプリログなど後から要素の数を柔軟に増減出来るようになります。さらに、Struct型のカラムにさらにStruct型を入れ込む事も出来きます。

Struct型のメリットとしては、「複数のテーブルを結合してまとめておいて、それをStruct型のカラムとしておくことで、結合コストを減らす事が出来る」という事。
ただし、その場合、pushdownに対応していないと、不要なカラムまでStrcut型に含めるのでデータが冗長になる、つまり、データサイズが増えてパースする時間が生じる(結合しなくても良いカラムまで含むので)。

なので、クエリ内で使える事とpushdown出来るかは別の話。 select句やWhere句・Group by句で、Struct型の要素を指定してクエリを書いた場合、その要素だけを取り出せている(pushdown出来ている)と期待しますが、実は違います。

クエリの実行計画は大事。必ず見て欲しいです。

クエリの頭に EXPLAIN または EXPLAIN EXTENDED を付けると確認出来ます。
Projection Pushdown または Predicate Pushdown に未対応な場合、select句(Projection) または where句(Predicate)にて、ネストしたカラムを1個、2個と要素を増やしても取得するデータサイズが変わっていない事が分かります。

それでは前置き長くなったので本題。

以下、前提として、2019/01/07時点のCDHにおけるHiveまたはImpalaを調査した結果に基づいています。

HiveでのネストしたカラムのPushdwonについて ~Complex型(Struct型)の要素のPushdown~

前提: Hiveで対応している 列指向なデータフォーマット ORCかParquet を対象にしています
結論: ネストしたカラム Complex型に対する pushdownはまだ未対応(なのでまるととってパースしてる)

実際にはこの事は、HiveのJIRAにも以下の様に ORCは HIVE-19103 、 Parquetは HIVE-14826 から現状の状況が確認出来ます。
[HIVE-19103] Nested structure Projection Push Down in Hive with ORC - ASF JIRA
[HIVE-14826] Support vectorization for Parquet - ASF JIRA

ただし、Where句(predicate)なら、今後、新しいVer.ので行けるようになるかも。
[ORC-323] Predicate push down for nested fields - ASF JIRA

ImpalaでのネストしたカラムのPushdwonについて ~Complex型(Struct型)の要素のPushdown~

前提: Impalaで対応している 列指向なデータフォーマット ORCかParquet を対象にしています
結論: ネストしたカラム Complex型に対する pushdownはまだ未対応(なのでまるととってパースしてる)

Impalaの公式ドキュメントには、Complex型に対する記載が以下のようにあります。
Complex Types (Impala 2.3 or higher only)

Impalaについては、基本的にParquetによる対応は進んでいますが、ORCについてはまだまだな状況です。
IMPALA-5717 にて対応はしたように見えますが、同Issueのコメントを見ると以下のようにまだまだ課題が残っています。
[IMPALA-5717] Support for ORC format files - ASF JIRA

更に、以下の IMPALA-6503 の通り、 Complex型への対応がまだ残っているようです。
[IMPALA-6503] Support reading complex types from ORC format files - ASF JIRA

まとめ

CDHの場合、パッチが適用されるので実際の本家のバージョンと対応状況が異なるかもです。
最新のCDH6系でHive及びImpalaで実行計画を試してみた訳ではないので、「いやいや対応してるよ」というものがあれば教えてください。

以上です。