【发布时间】: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-4905,issues.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