从配置单元中的子查询中获取值

xqkwcwgp  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(324)

我试图在配置单元中参数化值,而不是在查询中硬编码它。下面是查询。

select * from employee where sal >30000

但是我不需要使用30000值作为硬编码,而是需要它来自下面的相同查询。但我遇到了一些问题:

select * from employee where sal > (select max(sal) from employee)

感谢您的帮助。
谢谢

w80xi6nr

w80xi6nr1#

配置单元不支持这样的子查询,也不允许计算变量,配置单元中的变量是简单的文本替换,不需要计算。您可以在shell中计算 predicate 并传递给配置单元脚本,如下所示:https://stackoverflow.com/a/37821218/2700344
如果要在同一个配置单元查询中执行此操作,请在计算子查询时不要出错,并对其结果进行交叉联接,然后进行筛选。将首先计算子查询,然后将其结果放入分布式缓存中,并应用于每个读取表的Map器的筛选器中:

with sub as(--this is example only and makes no sense
            --replace with real query
            --of course there is no rows with sal>max sal in the same table
select max(S.sal) AS MaxSal from employee S  
)

select * 
  from employee e 
       cross join sub s  
where e.sal>s.MaxSal

如果你写的时候没有 CROSS JOIN ,很简单 from employee e, sub s ,或不带条件的连接,它仍然是相同的交叉连接,最好使用交叉连接显式编写它。

nxagd54h

nxagd54h2#

您可以尝试使用这种形式的配置单元查询。这将使雇员的工资等于最高工资。

SELECT e1.* FROM employee e1 
JOIN
(SELECT MAX(sal) as max_sal FROM employee) e2
ON e1.sal = e2.max_sal;

例子:

Table: employee
id  fname   sal
1   AAA     15000
2   BBB     35000
3   CCC     12000
4   DDD     35000
5   EEE     9000

查询执行输出:

2   BBB     35000
4   DDD     35000

相关问题