【问题标题】:Calculating Median using Percentile on Redshift在 Redshift 上使用百分位数计算中位数
【发布时间】:2019-07-04 00:57:10
【问题描述】:

我有一个超过 1800 万行的大表,我想计算中位数,为此我使用 PRECENTILE。不过耗时17分钟左右,不太理想。

这是我的查询

WITH raw_data AS
(
  SELECT name AS series,
         (duration) /(60000) AS value
  FROM warehouse.table
),
quartiles AS
(
  SELECT series,
         value,
         PERCENTILE_CONT(0.25) WITHIN GROUP(ORDER BY value) OVER (PARTITION BY series) AS q1,
         MEDIAN(value) OVER (PARTITION BY series) AS median,
         PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER BY value) OVER (PARTITION BY series) AS q3
  FROM raw_data
)
SELECT series,
       MIN(value) AS minimum,
       AVG(q1) AS q1,
       AVG(median) AS median,
       AVG(q3) AS q3,
       MAX(value) AS maximum
FROM quartiles
GROUP BY 1

有什么办法可以加快速度吗?

谢谢

【问题讨论】:

  • 我对您的时间/数据量感到惊讶!还有什么在运行吗?你有多少个什么类型的节点?我刚刚针对我的 2600 万行数据运行了您的代码,耗时 45 秒。中位数和百分位数在大型数据库中是相当困难的计算,所以
  • 我正在使用 8 个计算节点。

标签: amazon-redshift percentile


【解决方案1】:

您的查询要求 Redshift 做很多工作。数据必须根据您的PARTITION 列进行分配,并根据您的ORDER BY 列进行排序。

有两个选项可以让它更快:

  1. 使用更多硬件。 Redshift 性能非常线性地扩展。大多数查询在 2 倍硬件上的运行速度将提高 2 倍。
  2. 提前做一些工作。您可以通过重组表来最大化此查询的性能。使用 PARTITION 列作为分布键 (DISTKEY(series)) 和第一个排序键。使用 ORDER BY 列作为第二个排序键 (SORTKEY(series,value))。这将最大限度地减少回答查询所需的工作。节省的时间会有所不同,但我发现在我的小型测试集群上使用这种方法,3m30s PERCENTILE_CONT 查询下降到 30s。

【讨论】:

    【解决方案2】:

    要加快这部分的速度,请尝试以下操作

    SELECT distinct 
           series,
                 value,
                 PERCENTILE_CONT(0.25) WITHIN GROUP(ORDER BY value) OVER (PARTITION BY series) AS q1,
                 MEDIAN(value) OVER (PARTITION BY series) AS median,
                 PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER BY value) OVER (PARTITION BY series) AS q3
    
      FROM warehouse.table
    

    这可能会更快,因为它更有可能正确使用表格的排序/分布。 您必须在其他地方计算最小值和最大值。但至少看看它是否跑得更快。

    【讨论】:

    • 您好乔恩,感谢您的建议。但是,在使用您的建议后,我看到 2 分钟以上的改进
    【解决方案3】:

    您可以尝试APPROXIMATE PERCENTILE_DISC ( percentile ) 函数,该函数针对处理具有低错误百分比的分布式数据进行了优化,包括。中位数为 0.5

    【讨论】:

      猜你喜欢
      • 2011-12-29
      • 2013-06-20
      • 2017-09-04
      • 2015-02-25
      • 2021-02-26
      • 2017-10-12
      • 2017-10-19
      • 1970-01-01
      • 2016-07-28
      相关资源
      最近更新 更多