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.
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
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.