即使查询中存在分区谓词,也找不到Alias的分区谓词

时间:2016-08-20 01:23:55

标签: hadoop hive cloudera hiveql hue

我在hdfs中有一个表pos.pos_inv,由yyyymm分区。以下是查询:

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"

(schema)分区,yyyymm是int类型,actvydt是以字符串类型存储的日期。

3 个答案:

答案 0 :(得分:11)

这会发生,因为配置单元设置为严格模式。 这允许分区表访问hdfs中的相应分区/文件夹。

  set hive.mapred.mode=unstrict;  it will work 

答案 1 :(得分:1)

在您的查询错误中,它被说:找不到别名“inv”表“pos_inv”的分区谓词。

所以你必须为分区表的字段(对于pos_inv)而不是为另一个(inv)的字段放置where子句,就像你已经完成的那样。

答案 2 :(得分:1)

set hive.mapred.mode=unstrict 允许您访问整个数据而不是特定分区。在某些情况下需要读取整个数据集,例如:rank() over