在HIVE中减去查询

nlejzf6q  于 2023-03-12  发布在  Hive
关注(0)|答案(6)|浏览(316)

减号查询似乎在HIVE中不起作用。
尝试前:

select x from abc 
minus 
select x from bcd ;

是我做错了还是没有为HIVE定义减号查询?如果是这样,有没有其他方法可以得到结果?

ckx4rj1h

ckx4rj1h1#

HQL似乎不支持MINUS运算符,请参见相关的资源(虽然有点旧):
http://www.quora.com/Apache-Hive/What-are-the-biggest-feature-gaps-between-HiveQL-and-SQL
您想做的事情可以通过LEFT JOINNOT EXISTS来完成:

SELECT x
FROM abc
LEFT JOIN bcd
ON abc.x = bcd.x
WHERE bcd.x IS NULL

编辑:根据以下注解,不支持NOT EXISTS

SELECT x 
FROM abc
WHERE NOT EXISTS (SELECT x FROM bcd)
ergxz8rk

ergxz8rk2#

HQL不支持减号,但是你可以使用帕特里克Tucci的解决方案,当你的选择列表只包含几个字段时,它可以很好地工作。在我的例子中,我想找到整个表(30+字段)和备份副本之间的差异,以找到不同的记录。下面是我的解决方案:

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

现在,这并不完全是一个“减号”,因为mybackuptable中的单个记录将显示在结果中,这正是我想要的。为了使它成为一个完全的“减号”等价物,我添加了以下内容:

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
csga3l58

csga3l583#

如果格式稍有不同,上面的查询可能更容易阅读:

SELECT col1
FROM table1
WHERE NOT EXISTS (
    SELECT col2
    FROM table2 
    WHERE table1.col1 = table2.col2
)

这是一个相关子查询。也就是说,外部查询通过引用外部查询的子查询中包含的联接与内部(子)查询相关。
将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中-因此它们是不相关的。

camsedfj

camsedfj4#

从2.2.0版本开始,配置单元支持以下操作:

  • 相交[相异|全部]
  • 除外[不同|全部]
  • 减[相异|全部]

HIVE-12765
仅供参考,除外的减去是等效的。有些数据库只接受一次,配置单元接受两次。
默认情况下(SQL标准)应用distinct子句。
一个好的实践是总是显式地使用alldistinct子句。(对于union操作也是同样的建议)
如果您不需要执行代价高昂的distinct操作来消除重复行,那么最好使用保留所有行的all子句。

oewdyzsn

oewdyzsn6#

HIVE QL中支持NOT EXISTS
示例:

SELECT col1 FROM table1 WHERE NOT EXISTS SELECT col2 FROM table2 
WHERE table1.col1 = table2.col2

相关问题