Yyyymmでパーティション化されたhdfsのテーブルpos.pos_invがあります。以下はクエリです。
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
クエリのパーティション値を201501として指定しましたが、それでもエラーが発生します」
Error while compiling statement: FAILED: SemanticException [Error 10041]: No partition predicate found for Alias "inv" Table "pos_inv"
(スキーマ)パーティション、yyyymmはint型、actvydtは文字列型として保存された日付です。
これは、Hiveが厳格モードに設定されているために発生します。これにより、パーティションテーブルがhdfsの各パーティション/ folderにアクセスできます。
set Hive.mapred.mode=unstrict; it will work
クエリエラーでは次のように表示されます。エイリアス "inv"テーブル "pos_inv"のパーティション述語が見つかりません。
そのため、パーティションテーブルのフィールド(pos_invの場合)にはwhere句を配置する必要があります。