8

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

id    a      b    
xx    1      2    
yy    7      11    

我想为具有 < avg(a) 的用户计算 b 的标准偏差

我以这种方式计算 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(select a from...) 的“a”。这让我很困惑,因为它在前面的查询中有效。

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

编辑:

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

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

虽然这有效:

select avg(a) from temp;
4

3 回答 3

13

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

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

基本上 hive 不会将表缓存为变量。

于 2012-11-30T10:27:14.720 回答
0

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

Bob 我认为 hive 将不支持这种 select stddev_pop(b) from temp where a < ( select * from (select avg(a) from temp) x );

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

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

于 2013-12-05T06:34:49.670 回答
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

更新:我今天看到了一个类似的问题MySQL;抱歉,我不知道Hive。看看这是否有效:

select stddev_pop(b) 
from   temp 
where  a < ( select *
             from (select avg(a) from temp) x
          );
于 2012-11-29T17:43:26.137 回答