Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon redshift 使用红移百分比计算中位数_Amazon Redshift_Percentile - Fatal编程技术网

Amazon redshift 使用红移百分比计算中位数

Amazon redshift 使用红移百分比计算中位数,amazon-redshift,percentile,Amazon Redshift,Percentile,我有一个超过1800万行的大表,我想计算中间值,我使用的是Precentle。然而,所需时间约为17分钟,这并不理想 这是我的问题 WITH raw_data AS ( SELECT name AS series, (duration) /(60000) AS value FROM warehouse.table ), quartiles AS ( SELECT series, value, PERCENTILE_CONT(0.2

我有一个超过1800万行的大表,我想计算中间值,我使用的是Precentle。然而,所需时间约为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
有什么办法可以加快速度吗


谢谢

您的查询要求Redshift做大量工作。数据必须根据您的分区列进行分布,数据必须根据您的按列排序进行排序

有两种方法可以加快速度:

使用更多的硬件。红移性能非常线性扩展。大多数查询在2倍多的硬件上运行的速度是原来的2倍。 提前做一些工作。通过重新构造表,可以最大限度地提高此查询的性能。使用分区列作为分发键DISTKEYseries和第一个排序键。使用ORDER BY列作为第二个排序键SORTKEYseries的值。这将最大限度地减少回答查询所需的工作量。节省的时间会有所不同,但在我的小测试集群上,使用这种方法,我看到3m30s百分位控制查询下降到30s。
要加快部分速度,请尝试以下操作

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
这可能会更快,因为它更有可能正确使用表的排序/距离。
您必须在其他地方计算最小值和最大值。但至少要看看它是否运行得更快。

您可以尝试近似百分位功能,该功能针对低错误率的分布式数据进行了优化,包括将为0.5的中值。

我对您的计时/数据量感到惊讶!还有其他的吗?您有多少个节点是什么类型的?我刚刚用2600万行数据运行了你的代码,耗时45秒。在大型数据库中,中位数和百分位数的计算相当困难,因此我预计需要<45秒的时间。我正在使用8个计算节点。嗨,Jon,谢谢你的建议。然而,在使用您的建议后,我发现改进超过了2分钟