我正在使用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(它不是静态的)
有什么想法吗?
答案 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相同的行数是不正确的。由于过滤,您将获得更少的行,并且您无法改变此行为。