web-dev-qa-db-fra.com

Aucun prédicat de partition trouvé pour Alias ​​même lorsque le prédicat de partition est présent dans la requête

J'ai une table pos.pos_inv dans hdfs qui est partitionnée par yyyymm. Voici la requête:

select DATE_ADD(to_date(from_unixtime(unix_timestamp(Inv.actvydt, 'MM/dd/yyyy'))),5), 
       to_date(from_unixtime(unix_timestamp(Inv.actvydt, 'MM/dd/yyyy'))),yyyymm 
   from pos.pos_inv inv 
      INNER JOIN pos.POSActvyBrdg Brdg ON Brdg.EIS_POSActvyBrdgId = Inv.EIS_POSActvyBrdgId 
      where to_date(from_unixtime(unix_timestamp(Inv.nrmlzdwkenddt, 'MM/dd/yyyy'))) 
       BETWEEN DATE_SUB(to_date(from_unixtime(unix_timestamp(Inv.actvydt, 'MM/dd/yyyy'))),6) 
        and DATE_ADD(to_date(from_unixtime(unix_timestamp(Inv.actvydt, 'MM/dd/yyyy'))),6) 
        and inv.yyyymm=201501

J'ai fourni la valeur de partition pour la requête en 201501, mais j'obtiens toujours l'erreur " 

 Error while compiling statement: FAILED: SemanticException [Error 10041]: No partition predicate found for Alias "inv" Table "pos_inv"

(schéma) La partition, yyyymm est de type int et actvydt est la date stockée sous forme de type chaîne.

6
jeff

Cela se produit car la ruche est définie sur le mode strict . Cela permet à la table de partitions d’accéder à la partition/dossier respectif dans hdfs. 

  set Hive.mapred.mode=unstrict;  it will work 
9
Alvaro Joao

Dans votre erreur de requête, il est dit: Aucun prédicat de partition trouvé pour Alias ​​"inv" Table "pos_inv".

Donc vous devez mettre la clause where pour les champs de la table partitionnée (pour pos_inv), et pas pour l'autre (inv), comme vous l'avez fait.

1
Matias E