【问题标题】:How to avoid duplicate data scanning while running athena query如何在运行 athena 查询时避免重复数据扫描
【发布时间】:2020-10-12 04:42:59
【问题描述】:

我有两个查询来计算表中的一些属性 - 'agg_table'。第二个基本上是找出按 msgdate 分组的中值。我的预期输出应该有这 5 个字段: p>

msgdate、avg-Total、avg-duration、stddevmedian。目前我正在使用 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

【问题讨论】:

    标签: mysql amazon-athena


    【解决方案1】:

    我确信有一些技巧可以满足您的要求,但这并不是使用所有窗口函数最简单的方法 - 将这些组合起来总是很复杂。

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

    【讨论】:

    • 太棒了。我知道这个 approx_percentile 只在 spark 中有效。为我工作..谢谢
    猜你喜欢
    • 2019-11-11
    • 1970-01-01
    • 2020-02-04
    • 2021-10-15
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2019-10-14
    • 2022-01-01
    相关资源
    最近更新 更多