2016-06-13 3 views
0

を最適化私はHQLハイブHQLは - 繰り返しWINDOW句

私は1つに 3同じ WINDOW句を定義することができますどのように
SELECT count(*) OVER (PARTITION BY identity.hwid, passwordused.domain ORDER BY event.time ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) pocet, 
     min(event.time) OVER (PARTITION BY identity.hwid, passwordused.domain ORDER BY event.time ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) minTime, 
     max(event.time) OVER (PARTITION BY identity.hwid, passwordused.domain ORDER BY event.time ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) maxTime 
FROM t21_pam6 

を以下のがありますか?

ドキュメント(https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics )は

SELECT a, SUM(b) OVER w 
FROM T; 
WINDOW w AS (PARTITION BY c ORDER BY d ROWS UNBOUNDED PRECEDING) 

この一例を示している。しかし、私はそれが働いているとは思いません。 WINDOW wを定義することはできません... HQLコマンドではありません。

+1

元の質問に答えるだけで、「FROM T」の後にセミコロンを削除すると機能します。 WINDOW句は文ではなく、クエリの一部です。おそらく、その瞬間に文書に誤字がありました。 –

答えて

0

@ sergey-khudyakovが回答したように、ドキュメントにはバグがありました。

SELECT count(*) OVER w, 
      min(event.time) OVER w, 
      max(event.time) OVER w 
    FROM ar3.t21_pam6 
    WINDOW w AS (PARTITION BY identity.hwid, passwordused.domain ORDER BY  event.time ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) 
0

このタイプの最適化は、コンパイラが行う必要があるものです。これをプログラムで保証する方法はないと思います。

つまり、最小時間の計算は全く必要ありません。 order byのため、現在の行の時刻にする必要があります。それが条件に合致する最後の二つの値についてNULLを返しますので、maxtime計算が若干異なっていることを

SELECT count(*) OVER (PARTITION BY identity.hwid, passwordused.domain ORDER BY event.time ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) pocet, 
     event.time as minTime, 
     lead(event.time, 2) OVER (PARTITION BY identity.hwid, passwordused.domain ORDER BY event.time) as maxTime 
FROM t21_pam6; 

注:null値を扱うことができるならば同様に、式はに単純化することができます。

+0

minTime/maxTimeの最適化に関するヒントをありがとう。私の観点から見ると、最適化エンジンは正しく動作しており、マップ/リダクションのステップ数は問題ありませんが、別のプログラマにとっても読みやすいようにしたいと思います。 – Vity