[英]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.