I以下の(非常に単純な)ハイブのクエリを持っている:最適化ハイブGROUP BY
select user_id, event_id, min(time) as start, max(time) as end,
count(*) as total, count(interaction == 1) as clicks
from events_all
group by user_id, event_id;
表以下の構造を有する:
user_id event_id time interaction
Ex833Lli36nxTvGTA1Dv juCUv6EnkVundBHSBzQevw 1430481530295 0
Ex833Lli36nxTvGTA1Dv juCUv6EnkVundBHSBzQevw 1430481530295 1
n0w4uQhOuXymj5jLaCMQ G+Oj6J9Q1nI1tuosq2ZM/g 1430512179696 0
n0w4uQhOuXymj5jLaCMQ G+Oj6J9Q1nI1tuosq2ZM/g 1430512217124 0
n0w4uQhOuXymj5jLaCMQ mqf38Xd6CAQtuvuKc5NlWQ 1430512179696 1
私が知っているという事実のためにその行最初にuser_id
、次にevent_id
でソートされます。
質問は:行がソートされているので、クエリを最適化するためにHiveエンジンに "ヒント"する方法がありますか?最適化の目的は、グループを一度に1つずつ保持する必要があるため、すべてのグループをメモリに保持しないようにすることです。
現在、約300 GBのデータを持つ6ノードの16 GB Hadoopクラスタで実行されているこのクエリは、約30分かかり、ほとんどのRAMを使用してシステムを窒息させます。私は各グループが小さいので、(user_id, event_id)
タプルごとに100行を超えることはないことを知っています。したがって、最適化された実行はおそらく非常に小さなメモリフットプリントを持ち、高速になります(グループキーをループする必要がないため)。
'count(interaction == 1)'は私が期待したように動作していないので、1を持つ行だけをカウントし、代わりに 'count(*)'と同じものを返します。 –
COUNTを含む集計関数はNULL値を無視し、FALSEはNULLではありません。 –