Вычисление медианы с использованием Percentile на Redshift - PullRequest
0 голосов
/ 03 июля 2019

У меня есть большая таблица с более чем 18 миллионами строк, и я хочу вычислить Медиану, и я использую для этого 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

Есть ли способ ускорить это?

Спасибо

Ответы [ 3 ]

1 голос
/ 03 июля 2019

Ваш запрос просит Redshift сделать много работы. Данные должны быть распределены по столбцу PARTITION, а отсортированы по столбцу ORDER BY.

Есть два варианта сделать это быстрее:

  1. Использовать больше оборудования . Производительность красного смещения масштабируется очень линейно. Большинство запросов будут работать в 2 раза быстрее, чем в 2 раза больше оборудования.
  2. Сделай работу заранее . Вы можете максимизировать производительность для этого запроса путем реструктуризации таблицы. Используйте столбец PARTITION в качестве ключа распределения (DISTKEY(series)) и ключа первой сортировки. Используйте столбец ORDER BY в качестве второго ключа сортировки (SORTKEY(series,value)). Это сведет к минимуму работу, необходимую для ответа на запрос. Экономия времени будет меняться, но я вижу, что при использовании этого подхода в моем небольшом тестовом кластере количество запросов увеличится до 30 с * 3,830 *.
0 голосов
/ 03 июля 2019

Вы можете попробовать функцию APPROXIMATE PERCENTILE_DISC ( percentile ), которая оптимизирована для работы с распределенными данными с низким процентом ошибок, в т.ч.Медиана, которая будет 0,5

0 голосов
/ 03 июля 2019

Чтобы ускорить часть этого, попробуйте следующее

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

Это может быть быстрее, так как с большей вероятностью правильно использует сортировку / дистрибуцию вашей таблицы.Вы должны были бы рассчитать мин и макс в другом месте.но хотя бы посмотрим, будет ли он работать быстрее.

...