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