Sql 使用between算子的Hive不等式连接
我们有一个类似下面的查询:(partition\u date是我们的表分区) 我们意识到,通过将条件放置在Sql 使用between算子的Hive不等式连接,sql,hadoop,join,hive,Sql,Hadoop,Join,Hive,我们有一个类似下面的查询:(partition\u date是我们的表分区) 我们意识到,通过将条件放置在where子句中,它会导致一个完整的表扫描,因此我们需要将其作为上的放置在连接中 问题是Hive不支持不等式联接,因此我们考虑使用介于之间的运算符,如下所示: Select * from A JOIN B ON par_date between B.last_runtime and '99999999'; 这给了我们一个错误:遇到了左别名和右别名 在联接“9999999”中 如果我用实际值
where
子句中,它会导致一个完整的表扫描,因此我们需要将其作为上的放置在连接中
问题是Hive不支持不等式联接,因此我们考虑使用介于之间的运算符,如下所示:
Select * from A
JOIN B ON par_date between B.last_runtime and '99999999';
这给了我们一个错误:遇到了左别名和右别名
在联接“9999999”中
如果我用实际值替换B.last_runtime,比如说“20160310”,它可以正常工作
有什么想法吗?提前感谢A在B和C之间
转换为A大于或等于B,A小于或等于C,所以我认为它仍然是一个非等联接
但是,我无法解释错误消息的含义。如果要分析源代码,则会抛出:
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;
}
A在B和C之间
转换为A大于或等于B,A小于或等于C,所以我认为它仍然是一个非等联接
但是,我无法解释错误消息的含义。如果要分析源代码,则会抛出:
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;
}
配置单元将不支持任何操作,如
,配置单元将不支持任何操作,如
,如果将B.last\u运行时替换为常数,则不再具有联接条件,而不是a上的“where”条件。如果将B.last\u运行时替换为常数,则不再具有联接条件,而不是“where”条件A。
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