如何在运行雅典娜查询时避免重复数据扫描

PPARI1

我有两个查询来计算表'agg_table'的一些属性。第二个基本上是找出按msgdate分组的中位数。我的预期输出应具有以下5个字段:

msgdate,avg总计,avg持续时间,stddev中位数目前,我正在使用可以正常工作的UNION。我将在AWS Athena中执行此查询。为了计算中位数,因为第二个查询再次访问agg_data,所以数据扫描被加倍,假设输入数据大小为4 mb,在Athena历史记录页面中我可以看到扫描的数据为8 mb。

我想避免第二次进行数据扫描以节省成本。您能否通过一次调用agg_data来帮助我实现这一点

查询1:计算avg-Total,avg-duration,stddev

SELECT b.msgdate1 as msgdate,ROUND(b.avrg,3) AS avg-Total,
ROUND(AVG(b.duration),3) AS avg-duration,ROUND(b.stdv,3) AS stddev
FROM
(
SELECT AVG(a2.duration) OVER(PARTITION BY a2.msgdate) AS avrg, a2.duration as duration,a2.msgdate msgdate1,
  CASE
      WHEN stddev(a2.duration) OVER(PARTITION BY a2.msgdate) IS NULL THEN 0
      ELSE stddev(a2.duration) OVER(PARTITION BY a2.msgdate)
  END AS stdv
  FROM (
         agg_data
       ) a2 
) AS b
  

查询2:计算中位数

WITH RankedTable AS 
    (
        SELECT msgdate, duration, 
            ROW_NUMBER() OVER (PARTITION BY msgdate ORDER BY duration) AS Rnk,
            COUNT(*) OVER (PARTITION BY msgdate) AS Cnt
        FROM agg_data
    )
    SELECT msgdate,duration as median
    FROM RankedTable
    WHERE Rnk = Cnt / 2 + 1 or Cnt=1
跟随

我敢肯定,有一些技巧可以满足您的要求,但这并不是所有窗口函数最简单的方法-组合这些函数总是很复杂。

如果您可以接受近似值,则可以使用该approx_percentile函数-approx_percentile(column, 0.5)将是中位数的近似值。可以在第一个查询中使用它,而无需第二个查询。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章