簡體   English   中英

將子查詢轉換為單個查詢Hive

[英]Converting Sub query to a single query Hive

我有一個查詢,該查詢需要按colB分組的colA計數和特定的COlC平均值平均值。 例如

SELECT COUNT( X.colA ), X.colB , X.MEASURE
FROM (
  SELECT colA  , colB  , avg(colC) MEASURE
  FROM tableA
  GROUP BY colA, colB
  HAVING round(avg(colC),2) > 0
) X 
GROUP BY X.MEASURE , X.colB
HAVING X.MEASURE BETWEEN 0 AND 3000
ORDER BY MEASURE

示例結果可能是

No of User, URL    , average time spent
90182     , abc.com,    334
293556    , def.com,     33

上述查詢的問題在於,由於它具有子查詢,因此內部子查詢會重排大量數據,作為外部查詢的中間結果,這會導致在大型數據集上查詢變得非常慢。

有沒有一種方法可以將上面的查詢轉換為沒有任何子查詢的查詢,或者是否有可用的UDAF,這樣就不再有中間數據的大改組並且它可以在單個階段中運行?

我看不到簡化查詢的簡便方法。 但是,將having子句移到子查詢中可能會提高性能:

SELECT COUNT( X.colA ), X.colB , X.MEASURE
FROM (SELECT colA  , colB  , avg(colC) MEASURE
      FROM tableA
      GROUP BY colA, colB
      HAVING round(avg(colC),2) > 0 and avg(colC) <= 3000
     ) X 
GROUP BY X.MEASURE , X.colB
ORDER BY MEASURE;

您要按一組行的平均值進行匯總。 這似乎需要進行兩項操作-一種用於計算平均值,另一種用於最終匯總。

實際上,如果考慮一下,以下可能會做您想要的事情:

select colB, count(distinct colA), sum(colC) / count(distinct colA) as measure
from tableA
group by colA
having sum(colC) / count(distinct colA) between 0 and 3000
order by measure;

它並不完全相同,但是我不理解外部查詢中按measure分組的目的。 對於每個b值只有一行的摘要可能就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM