我们有一个类似于以下的查询:(partition_date是我们的表分区)
SELECT * FROM A
JOIN B
where partition_date > B.last_runtime;
我们意识到,通过将条件放在
where
子句中会引起全表扫描,因此我们需要将其作为JOIN
放置在ON
中。问题在于,Hive不支持不等式联接,因此考虑使用
BETWEEN
运算符,如下所示:Select * from A
JOIN B ON par_date between B.last_runtime and '99999999';
如果我将B.last_runtime替换为实际值,请说“20160310”,这样就可以了...
有任何想法吗?提前致谢
最佳答案
A BETWEEN B AND C
转换为A大于或等于B AND A小于或等于C,因此我认为它仍然是非等参的。
但是,我无法解释错误消息的含义。如果您想分析源代码,则将其抛出here:
private static boolean hasTableAlias(JoinTypeCheckCtx ctx, String tabName, ASTNode expr)
throws SemanticException {
int tblAliasCnt = 0;
for (RowResolver rr : ctx.getInputRRList()) {
if (rr.hasTableAlias(tabName))
tblAliasCnt++;
}
if (tblAliasCnt > 1) {
throw new SemanticException(ErrorMsg.INVALID_JOIN_CONDITION_1.getMsg(expr));
}
return (tblAliasCnt == 1) ? true : false;
}
关于sql - 配置单元之间使用 hive 不等式联接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35933550/