Hive中的左外连接导致行减少

时间:2018-03-15 05:02:05

标签: sql join hive

我正在使用Hive使用val rdd = tempdf.collect().map(row => (row(0).asInstanceOf[Seq[Seq[String]]], row(1).asInstanceOf[Seq[Seq[String]]])) val first = rdd(0)._1.map(x => x.toList).toList //first: List[List[String]] = List(List(id, id1), List(add1), List(add2)) val second = rdd(0)._2.map(x => x.toList).toList //second: List[List[String]] = List(List(name), List(city1), List(city2)) 连接表,期望由于它是外连接,因此左列中的行数不应减少。但是,这不是我所看到的。

假设表A有100k行,表B有200k。我的假设就是这样,如果我做一个左外连接left outer join,我永远不应该看到小于100k(A的大小)的行。就我而言,我看到行减少了!我正试图看看我如何以一种我可以在SO上分享的方式进行复制。同时,如果我的假设是错误的,请告诉我。

我的查询中有一个潜在的皱纹。还有一个where子句:

select ... from A left outer join B on A.x=B.x

请注意,我注意检查B.y是否为null值,因此它保留了左外连接语义。

编辑: 有几个人提到将where子句移动到连接。但是,这会导致问题。首先,它抱怨join子句中不支持'或'。如果我删除它(因为不再需要空检查),我收到此错误:

SELECT ... FROM A LEFT outer join B on A.x=B.x WHERE (B.y is null or B.y is between date_sub(A.y,5) and date_sub(A.y,1)

这可能是因为Both left and right aliases encountered in JOIN子句引用了表A和表B(它不是静态的)

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您必须从where中删除join条款,然后将其移至on

您可以使用以下查询:

select ... 
from A 
left outer join B on A.x=B.x 
and (B.y is null or B.y is between date_sub(A.y,5) and date_sub(A.y,1)

答案 1 :(得分:0)

这是一个示例查询,显示在左连接中添加where子句与在左连接中添加相同条件不同。

http://sqlfiddle.com/#!18/ff32a/2

因此,您假设您将获得与表A相同的行数是不正确的。由于过滤,您将获得更少的行,并且您无法改变此行为。