Hive SQL中的嵌套查询

时间:2012-11-29 17:22:27

标签: sql hive

我有一个数据库,我使用查询来生成这样的中间表:

id    a      b    
xx    1      2    
yy    7      11    

我想为具有<的用户计算b的标准偏差。平均(a)中

我用这种方式计算avg(a)并且它工作正常:

select avg(select a from (query to produce intermediate table)) from table;

但查询:

select stddev_pop(b) 
from (query to produce intermediate table) 
where a < (select avg(select a 
                     from (query to produce intermediate table))
          from table);

给我一​​个错误,更准确地说,我被告知无法识别来自avg的“a”(从...中选择一个)。这让我很困惑,因为它适用于上一个查询。

如果有人可以提供帮助,我将不胜感激。

编辑:

我将查询结果存储到临时表中生成中间表,但仍遇到同样的问题。 非工作查询变为:

select stddev_pop(b) from temp where a < (select avg(a) from temp);

虽然这有效:

select avg(a) from temp;

3 个答案:

答案 0 :(得分:12)

好的,一位同事帮我做了。如果有人遇到同样的问题,我会发布答案:

select stddev_pop(b)
from temp x
join (select avg(a) as average from temp) y
where x.a < y.average;

基本上,配置单元不会将表缓存为变量。

答案 1 :(得分:0)

您可能需要在WHERE子句中移动括号。试试这个:

select stddev_pop(b) 
from (query to produce intermediate table) 
where c < ( select avg(a) 
            from (query to produce intermediate table)
          );

而且,您的问题涉及专栏c;你的意思是a吗?

更新:我今天看到了a similar question MySQL;抱歉,我不知道Hive。看看是否有效:

select stddev_pop(b) 
from   temp 
where  a < ( select *
             from (select avg(a) from temp) x
          );

答案 2 :(得分:0)

好的,首先,hive不支持除了from子句以外的任何地方的子查询。 所以你不能在where子句中使用子查询来在from子句中创建临时表,你可以使用该表。 现在,如果您创建临时表而不是在where子句中使用它而不是引用该临时表,则必须再次运行提取查询,因此它将不再支持。

鲍勃我觉得蜂巢不会支持这个 选择stddev_pop(b) 来自临时 其中a&lt; ( 选择 *              from(从temp中选择avg(a))x           );

但是是的 选择stddev_pop(b) 来自临时x join(选择avg(a)作为temp的平均值)y 其中x.a&lt; y.average;

如果我们可以在物理上创建临时表并将数据选择avg(a)作为temp的平均值,那么我们就可以参考。