0
votes

Existe-t-il un moyen d'éliminer une sous-requête de cette requête Hive?

Modifier: J'utilise Apache Hive (version 3.1.0.3.1.5.0-152)

Lorsque j'exécute la requête suivante:

insérer dans delta_table (sélectionnez * dans batch_table où loaddate = (sélectionnez max (loaddate) dans batch_table));

J'obtiens cette erreur:

Expression de sous-requête non prise en charge 'loaddate': uniquement les expressions de sous-requête qui sont des conjonctures de premier niveau sont autorisées

Nous avons une table qui est écrite dans des lots quotidiens avec la colonne loaddate qui est unique pour chaque lot. Le but de la requête est d'obtenir tous les enregistrements du lot le plus récent sans connaître sa date de chargement. Je soupçonne que le problème est dû au fait que j'utilise une sous-requête dans une sous-requête. Existe-t-il un moyen de modifier cette requête pour faire la même chose, mais sans la dernière sous-requête?


2 commentaires

dépend de quelle version de ruche vous avez? , vous pouvez utiliser la clause (avec as)


Remplacez-la par une table dérivée et joignez-la.


3 Réponses :


0
votes

Dépend de la version de la ruche dont vous disposez, mais vous pouvez utiliser la clause avec pour éviter la deuxième sous-requête

with max_load as ( select max(loaddate) as loaddate from batch_table) 
    insert into delta_table 
    (select * from batch_table a where a.loaddate=max_load.loaddate);


3 commentaires

J'ai Apache Hive (version 3.1.0.3.1.5.0-152) , j'ai essayé cette requête, mais j'ai obtenu un alias de table ou référence de colonne invalide 'max_load': (les noms de colonne possibles sont : ... erreur


Essayez de le faire avec une jointure interne


avec max_load as (sélectionnez max (loaddate) comme loaddate depuis batch_table) insérez dans delta_table (sélectionnez * de batch_table une jointure interne max_load sur a.loaddate = max_load.loaddate);



0
votes

Il semble que l'erreur soit due au fait que la table n'a pas été créée correctement et pour une raison quelconque, cela a entraîné l'échec de la requête. J'ai recréé le tableau et cela fonctionne maintenant


0 commentaires

0
votes

La fonction analytique + filtre sera plus efficace que l'auto-jointure ou la sous-requête avec une autre analyse de table pour trouver la date maximale:

insert into delta_table 
select col1, col2, ... coln --list columns here
from
(
select t.*, rank() over(order by loaddate desc) rnk
  from batch_table t
)s
where rnk=1;


0 commentaires