2017-09-08 4 views
-1

J'utilise une ruche couplée à hadoop. Je recherche une fonction (hiveql) qui permet de trier une liste de clients correspondant à une règle. Je souhaite effectuer un test de condition au cours des 10 derniers jours consécutifs (colldate). Le résultat attendu est une liste des seuls clients (ressourcename) qui maths cette condition: succès> = 3 au cours des 10 derniers jours. Chaque client a enregistré une entrée (nombre de succès) par jour. J'utilise la requête suivante mais de nombreuses cartes réduites sont construites et cela prend beaucoup de temps. Je cherche un moyen d'optimiser:Agrégation Hiveql: tests de récurrence

  select J1.colldate,J1.ResourceName 
      from 
      TABLE J1, 
      TABLE J2, 
      TABLE J3, 
      TABLE J4, 
      TABLE J5, 
      TABLE J6, 
      TABLE J7, 
      TABLE J8, 
      TABLE J9, 
      TABLE J10 
      WHERE 
      J1.ResourceName=J2.ResourceName 
      and J1.ResourceName=J3.ResourceName 
      and J1.ResourceName=J4.ResourceName 
      and J1.ResourceName=J5.ResourceName 
      and J1.ResourceName=J6.ResourceName 
      and J1.ResourceName=J7.ResourceName 
      and J1.ResourceName=J8.ResourceName 
      and J1.ResourceName=J9.ResourceName 
      and J1.ResourceName=J10.ResourceName 
      and J1.success>=3 
      and J2.success>=3 
      and J3.success>=3 
      and J4.success>=3 
      and J5.success>=3 
      and J6.success>=3 
      and J7.success>=3 
      and J8.success>=3 
      and J9.success>=3 
      and J10.success>=3 
      and J1.colldate=from_unixtime(unix_timestamp()-1*60*60*24, 'dd/MM/yyyy') 
      and J2.colldate=from_unixtime(unix_timestamp()-2*60*60*24, 'dd/MM/yyyy') 
      and J3.colldate=from_unixtime(unix_timestamp()-3*60*60*24, 'dd/MM/yyyy') 
      and J4.colldate=from_unixtime(unix_timestamp()-4*60*60*24, 'dd/MM/yyyy') 
      and J5.colldate=from_unixtime(unix_timestamp()-5*60*60*24, 'dd/MM/yyyy') 
      and J6.colldate=from_unixtime(unix_timestamp()-6*60*60*24, 'dd/MM/yyyy') 
      and J7.colldate=from_unixtime(unix_timestamp()-7*60*60*24, 'dd/MM/yyyy') 
      and J8.colldate=from_unixtime(unix_timestamp()-8*60*60*24, 'dd/MM/yyyy') 
      and J9.colldate=from_unixtime(unix_timestamp()-9*60*60*24, 'dd/MM/yyyy') 
      and J10.colldate=from_unixtime(unix_timestamp()-10*60*60*24, 'dd/MM/yyyy'); 

la structure de la table est: enter image description here

+0

Ajouter un échantillon de données qui comprend l'ensemble de lignes de source et l'ensemble de lignes demandées. –

Répondre

0

Disons que nous avons une table comme ça, je suppose ici que tout ce que vous avez un enregistrement d'une jour:

+------------+----------+-------+ 
|ResourceName| colldate|success| 
+------------+----------+-------+ 
|   a|2017-01-01|  10| 
|   a|2017-01-02|  14| 
|   a|2017-01-03|  9| 
|   a|2017-01-04|  12| 
|   a|2017-01-05|  8| 
|   a|2017-01-06|  7| 
|   a|2017-01-07|  13| 
|   a|2017-01-08|  11| 
|   a|2017-01-09|  5| 
|   a|2017-01-10|  2| 
|   a|2017-01-11|  16| 
|   a|2017-01-12|  10| 
|   a|2017-01-13|  9| 
|   a|2017-01-14|  17| 
|   a|2017-01-15|  12| 
|   a|2017-01-16|  10| 
|   a|2017-01-17|  13| 
|   a|2017-01-18|  7| 
|   a|2017-01-19|  9| 
|   a|2017-01-20|  3| 
+------------+----------+-------+ 

Vous pouvez utiliser une fonction de fenêtre qui sera beaucoup plus efficace que 10 rejoint:

SELECT 
    *, 
    ( 
     sum(CAST(success >= 3 AS Int)) OVER ( 
      PARTITION BY ResourceName ORDER BY colldate ROWS BETWEEN 9 PRECEDING AND CURRENT ROW 
     ) 
    ) == 10 AS success_for_10days 
FROM J 

+------------+----------+-------+------------------+ 
|ResourceName| colldate|success|success_for_10days| 
+------------+----------+-------+------------------+ 
|   a|2017-01-01|  10|    false| 
|   a|2017-01-02|  14|    false| 
|   a|2017-01-03|  9|    false| 
|   a|2017-01-04|  12|    false| 
|   a|2017-01-05|  8|    false| 
|   a|2017-01-06|  7|    false| 
|   a|2017-01-07|  13|    false| 
|   a|2017-01-08|  11|    false| 
|   a|2017-01-09|  5|    false| 
|   a|2017-01-10|  2|    false| 
|   a|2017-01-11|  16|    false| 
|   a|2017-01-12|  10|    false| 
|   a|2017-01-13|  9|    false| 
|   a|2017-01-14|  17|    false| 
|   a|2017-01-15|  12|    false| 
|   a|2017-01-16|  10|    false| 
|   a|2017-01-17|  13|    false| 
|   a|2017-01-18|  7|    false| 
|   a|2017-01-19|  9|    false| 
|   a|2017-01-20|  3|    true| 
+------------+----------+-------+------------------+ 

Et puis filtre sur success_for_10days