web-dev-qa-db-ja.com

クエリにパーティション述語が存在する場合でも、エイリアスのパーティション述語が見つかりません

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は文字列型として保存された日付です。

8
jeff

これは、Hiveが厳格モードに設定されているために発生します。これにより、パーティションテーブルがhdfsの各パーティション/ folderにアクセスできます。

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

クエリエラーでは次のように表示されます。エイリアス "inv"テーブル "pos_inv"のパーティション述語が見つかりません。

そのため、パーティションテーブルのフィールド(pos_invの場合)にはwhere句を配置する必要があります。

1
Matias E