2016-06-13 1 views
0

Je suit HQLRuche HQL - optimisation clause WINDOW répétitive

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 

Comment puis-je définir les 3 clauses mêmes WINDOW en un seul?

La documentation (https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics ) montre cet exemple

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

Mais je ne pense pas que ça fonctionne. Il n'est pas possible de définir WINDOW w car ... n'est pas une commande HQL.

+1

Juste pour répondre à votre question initiale - cela fonctionnera si vous supprimez le point-virgule après 'FROM T'. La clause WINDOW n'est pas une instruction mais une partie de la requête. Probablement, il y avait une faute de frappe dans la documentation à ce moment-là. –

Répondre

0

Comme @ sergey-khudyakov a répondu, il y avait un bug dans la documentation. Cette variante fonctionne bien:

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

Ce type d'optimisation est quelque chose que le compilateur devrait faire. Je ne pense pas qu'il existe un moyen d'assurer cela par programme. Cela dit, le calcul du temps minimum est totalement inutile. En raison du order by, il devrait être l'heure dans la ligne actuelle. De même, si vous pouvez gérer null les valeurs, l'expression peut être simplifiée:

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; 

Notez que le calcul maxtime est légèrement différent parce qu'il retournera NULL pour les deux dernières valeurs correspondant aux conditions.

+0

Merci pour l'indice sur l'optimisation de minTime/maxTime. De mon point de vue, le moteur d'optimisation fonctionne correctement et le nombre de pas map/reduce est correct, mais je voudrais aussi le rendre plus lisible pour un autre programmeur - pour extraire la partie répétitive en une seule. – Vity