Hive Query 不允许 >= 在 where 子句的子查询中

Posted

技术标签:

【中文标题】Hive Query 不允许 >= 在 where 子句的子查询中【英文标题】:Hive Query doesnt allow >= in subquery in the where clause 【发布时间】:2020-07-01 10:45:24 【问题描述】:

我有一个生成日期的表 (umt_date),我需要在第二个查询中使用此日期来获取大于等于 umt_date 表中日期的所有数据

umt_date
----------------------------
|processdate||processname|
----------------------------
| 2020-06-01 | A         |
----------------------------
| 2020-06-01 | B         | 

当我执行 sql 时

select * from main_table
where processdate >= (select processdate from umt_date where processname='A')

我收到以下错误

SQL 错误 [40000] [42000]:编译语句时出错:FAILED:SemanticException Line 0:-1 Unsupported SubQuery Expression 'processdate':只允许作为***连接的子查询表达式

由于我们没有任何公共列,因此我们也无法执行连接。有什么替代方案?

【问题讨论】:

您使用的是什么版本的配置单元? 【参考方案1】:

如果子查询返回单行,使用交叉连接:

select m.* 
     from main_table m
          cross join (select processdate from umt_date where processname='A') t
where m.processdate >= t.processdate 

如果子查询返回多于一行,则在某些条件下使用连接。在这种情况下交叉连接不好,因为它会重复数据,尽管 WHERE 可能会过滤重复的行

【讨论】:

我检查了硬编码日期与交叉连接的查询性能,交叉连接的时间是普通连接的 3 倍。所以交叉连接引入了性能问题 @DhirajTayade 是的。确实如此。这是预期的,对吧?因为硬编码的日期查询只扫描一张表。并且根本不加入。您可以使用 shell 执行子查询以获取日期并将该日期作为参数传递给第二个查询 使用 hivevars 也无济于事,因为 Hive 在替换之前不会评估变量。 @DhirajTayade 是的,您不能在同一个脚本中执行此操作。使用外壳。使用一个 hive 脚本计算日期并将其传递给另一个【参考方案2】:

您可以尝试使用WITH 子句,如下所示

 WITH PROCESSA_SUBQ AS(
   select processdate from umt_date where processname='A'
 )
 SELECT a.* FROM main_table as a
 INNER JOIN
 PROCESSA_SUBQ as b
 ON 1=1    -- always true join condition, can be ignored.
 where a.processdate >= b.processdate

或者您也可以进行布尔条件检查:

WITH PROCESSA_SUBQ AS(
   select processdate from umt_date where processname='A'
 )
 SELECT X.* FROM (
 SELECT a.*, (a.processdate>=b.processdate) as check FROM main_table as a
 INNER JOIN
 PROCESSA_SUBQ as b
 ON 1=1  -- always true join condition, can be ignored.
 ) as X where X.check = true

【讨论】:

没有 ON 条件的 INNER JOIN 是 CROSS JOIN 同意。但由于 processdate 返回单行,这并不重要。 你真的在做交叉连接,它不会那么混乱。 你去。添加了加入条件。 我检查了硬编码日期与交叉连接的查询性能,交叉连接的时间是普通连接的 3 倍。所以交叉连接引入了性能问题

以上是关于Hive Query 不允许 >= 在 where 子句的子查询中的主要内容,如果未能解决你的问题,请参考以下文章

Presto on Search of normal select query[non partitioned hive table]给出列$path在数据库默认表<Table>中不存在

在生产数据库上运行解释 <insert query in hive> 是不是安全

Apache Hive vs Apache Impala Query Performance

失败:HIVE QUERY 中的 NullPointerException null

运行 Hive Query 时出现 Mysql 错误

Big Query 不允许创建表