我们有类似下面的查询:(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';
这给了我们错误:遇到了左右别名 在加入' 99999999''
如果我用实际值替换B.last_runtime,请说' 20160310'它工作正常......
任何想法?提前致谢
答案 0 :(得分:0)
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;
}
答案 1 :(得分:0)
在加入条件期间,Hive不支持>
,<
,<=
,>=
等任何操作。可能会left
或right
加入。这是一个例子:
select A.Name, A.Address, B.salary from Person_details as A left join Person_earnings as B on (B.salary > 15000)
<强>代替强>
select A.Name, A.Address, B.salary from Person_details as A left join Person_earnings as B on (A.Id=B.Id) where B.salary > 15000
首先,应该进行相等操作,之后可以应用其他条件。由于Hive用于大型数据集,因此它首先仅支持相等条件。