select <all-my-fields>, count(*)
from (
select <all-my-fields> from mytable
union all
select <all-the-fields> from mybackuptable
) merged_data
group by <all-my-fields>
having count(*) = 1
select <all-my-fields>
from (
select max(source) source, <all-my-fields>, count(*)
from (
select 1 source, <all-my-fields> from mytable
union all
select 2 source, <all-the-fields> from mybackuptable
) merged_data
group by <all-my-fields>
having count(*) = 1
) minus_data
where source = 1
6条答案
按热度按时间ckx4rj1h1#
HQL似乎不支持
MINUS
运算符,请参见相关的资源(虽然有点旧):http://www.quora.com/Apache-Hive/What-are-the-biggest-feature-gaps-between-HiveQL-and-SQL
您想做的事情可以通过
LEFT JOIN
或NOT EXISTS
来完成:编辑:根据以下注解,不支持
NOT EXISTS
。ergxz8rk2#
HQL不支持减号,但是你可以使用帕特里克Tucci的解决方案,当你的选择列表只包含几个字段时,它可以很好地工作。在我的例子中,我想找到整个表(30+字段)和备份副本之间的差异,以找到不同的记录。下面是我的解决方案:
现在,这并不完全是一个“减号”,因为mybackuptable中的单个记录将显示在结果中,这正是我想要的。为了使它成为一个完全的“减号”等价物,我添加了以下内容:
csga3l583#
如果格式稍有不同,上面的查询可能更容易阅读:
这是一个相关子查询。也就是说,外部查询通过引用外部查询的子查询中包含的联接与内部(子)查询相关。
将tbl 1连接到tbl 2后,该连接的结果(即在本例中,table1.col1和table2.col2中同时存在的col 2值的列表)将应用NOT Exists,以从Table 1中的col 1值列表中删除这些值。结果是table 1中的col 1值列表,而table 2中不存在这些值。
Table 2中不存在于table 1中的任何“额外”值都不会在此查询中起作用,因为它们已被内连接删除。这很好,因为此查询正尝试返回table 1中不存在于table 2中的那些值-table 2中的额外值首先不存在于table 1中-因此它们是不相关的。
camsedfj4#
从2.2.0版本开始,配置单元支持以下操作:
HIVE-12765
仅供参考,除外的和减去是等效的。有些数据库只接受一次,配置单元接受两次。
默认情况下(SQL标准)应用distinct子句。
一个好的实践是总是显式地使用all和distinct子句。(对于union操作也是同样的建议)
如果您不需要执行代价高昂的distinct操作来消除重复行,那么最好使用保留所有行的all子句。
bvpmtnay5#
目前,配置单元不支持
MINUS
功能。请参见http://www.quora.com/Apache-Hive/What-are-the-biggest-feature-gaps-between-HiveQL-and-SQLoewdyzsn6#
HIVE QL中支持
NOT EXISTS
。示例: