【问题标题】:No partition predicate found for Alias even when the partition predicate in present in the query即使查询中存在分区谓词,也没有为 Alias 找到分区谓词
【发布时间】:2016-12-27 05:44:30
【问题描述】:

我在 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为日期存储为字符串类型。

【问题讨论】:

  • jeff,你使用的是哪个版本的 hive,我认为在 Join 组合中使用分区谓词列时,存在一些与此问题相关的开放 jira 问题(issues.apache.org/jira/browse/HIVE-4905issues.apache.org/jira/browse/HIVE-10454) ,如果您使用的是旧版本的 hive,请尝试将 mapred 模式设置为 nonstrict 并运行查询 set hive.mapred.mode=nonstrict
  • 如果我使用 set hive.mapred.mode=nonstrict ,则扫描整个数据集而不是特定的分区值。
  • jeff,我认为这是一个临时解决方法,可能这个补丁更新到最新版本,你的 hive 是哪个版本的,可以在更高版本中尝试吗?
  • 解决方法:使用分区谓词将有问题的表包装在子查询中,(select * from table where partition > value)这样可以避免错误并避免扫描整个表。
  • 如果您使用nonstrict 解决方法来处理从命令行使用beeline 发送的查询(例如beeline -u "jdbc:..." -e "select ..."),您需要在命令行中添加它:--hivevar hive.mapred.mode=unstrict

标签: hadoop hive cloudera hiveql hue


【解决方案1】:

这是因为 hive 设置为严格模式。 这允许分区表访问 hdfs 中的相应分区/文件夹。

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

【讨论】:

  • -1 这不是正确的用法。您应该使用适当的谓词过滤您的选择语句。例如。如果表有一个名为 'dt' 的谓词,则 Select * from MyTable where dt='2017/10/10'
【解决方案2】:

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

因此,您必须将 where 子句用于分区表的字段(用于 pos_inv),而不是像您所做的那样用于另一个(inv)。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 2020-02-19
      相关资源
      最近更新 更多