Замечательный SQL|Новые идеи для оптимизации дедуплицированных кубических вычислений

введение

SQL в настоящее время является наиболее распространенным языком запросов к базам данных. Его функции и возможности намного сложнее, чем обычно используемый "SELECT * FROM tbl". Производительность хорошего SQL и плохого SQL может быть в десятки или тысячи раз. Чтобы написать SQL, который может учитывать как производительность, так и простоту использования, выходит за рамки простого понимания количества новых функций и новых способов написания, но также требует глубокого понимания процесса обработки данных, а затем разработки хорошего процесса обработки данных. .

Поэтому я хотел бы запустить эту серию статей и назвать ее «Фантастический SQL».Я надеюсь начать с реальных случаев и поделиться с вами некоторыми новыми решениями и идеями обработки SQL-данных, а также смоделировать понимание сути проблемы. в процессе. Надеюсь, вам всем понравится~.

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

1. Описание сцены

При выполнении сводных расчетов данных и статистического анализа наиболее трудным является расчет повторяющихся показателей (таких как количество пользователей, количество продавцов и т. д.), особенно детальный анализ с несколькими измерениями. -аддитивный характер, то есть практически каждый элемент необходимо пересчитывать при изменении статистической комбинации показателей. Когда объем данных невелик, можно считать, что подробные данные могут использоваться автоматически и непосредственно для немедленной статистики, но когда объем данных велик, расчеты необходимо производить заранее.

Типичные сценарии следующие: количество пользователей ежедневных платежей клиента Alipay по размерам провинции, города и района (где провинция, город и район — это места, где пользователи осуществляют платежи, соответствующие показателям данных в таблице). ).

Существует ситуация, когда пользователь использовал Alipay для оплаты один раз в городе Ханчжоу утром, а затем снова использовал Alipay для оплаты в автономном режиме, когда он отправился в город Шаосин днем. Затем при подсчете количества ежедневных платящих пользователей в измерении «Провинция + город» оно должно быть в измерениях городов Ханчжоу и Шаосин. Оно должно быть дедуплицировано пользователем, и это может быть только измерение 1 провинции Чжэцзян. В этом случае обычно необходимо выполнить предварительный расчет данных в виде Куба, при этом каждую комбинацию измерений необходимо дедуплицировать, поскольку она не подлежит накоплению. Сценарий в этой статье представляет собой примерно куб дедупликации.

2. Общие методы реализации

При прямом расчете каждая комбинация размеров рассчитывается отдельно. Например, можно создать отдельно несколько таблиц с такими комбинациями измерений, как провинция, провинция+город, провинция+город+район и т. д. Для каждой таблицы рассчитываются только фиксированные размеры. Затем происходит расширение и пересчет данных, например Union All или Lateral View Explode или функция расчета куба MaxCompute.Посредством расширения данных реализуется метод расчета данных, который удовлетворяет нескольким комбинациям измерений, как показано на рисунке ниже.

Этот третий способ записи на самом деле аналогичен: основное внимание уделяется расширению данных, как показано на рисунке, а затем выполнению повторной статистики. Процесс выполнения показан ниже. Основная идея состоит в том, чтобы сначала «развернуть» данные на несколько строк, а затем выполнить дедупликацию статистики в соответствии с «обычным» Distinct. Таким образом, серьезной разницы в производительности нет, в основном в ремонтопригодности кода.

3. Анализ производительности

Суть следующего метода заключается в том, чтобы сначала «раздуть» данные и разбить их на несколько строк, а затем выполнить дедупликацию статистики в соответствии с «обычными».Разницы в производительности нет, в основном с точки зрения сопровождаемости кода. Время расчета этих нескольких решений будет линейно увеличиваться с комбинацией параметров спроса, и в то же время также будет добавлено их уникальное влияние на низкую производительность вычислений.

В реальных экспериментах мы обнаружили, что в процессе расчета кубов дедупликации более 80 % вычислительных затрат уходит на расширение и передачу данных. Например, чтобы извлечь сценарии основных показателей, необходимо рассчитать количество платящих пользователей в различных комбинационных измерениях.В реальном эксперименте большой объем данных в 10 миллиардов данных увеличился почти в 10 раз, размер данных промежуточного результата увеличился со 100 ГБ до 1 ТБ, а объем данных увеличился с 10 миллиардов до почти 130 миллиардов. Большая часть вычислительных ресурсов и времени вычислений тратится на расширение и передачу данных. Если фактическое измерение комбинации еще больше увеличится, размер расширения данных также будет увеличен.

4. Новая идея

Для начала давайте разберем проблему: ядро ​​вычислительного процесса куба дедупликации разделено на две части: расширение данных + дедупликация данных. Расширение данных решает проблему строки данных, удовлетворяющей одновременному вычислению нескольких размерных комбинаций.Блок дедупликации данных завершает окончательную статистику дедупликации.Основное решение по-прежнему связано с необходимостью соответствия исходных данных результирующим данным. Объем вычислений для самой дедупликации данных увеличится, а расширение данных усугубит эту ситуацию, поскольку в процессе перемешивания необходимо дизассемблировать и передать большой объем данных. В процессе расчета данных данные сначала расширяются, а затем агрегируются.Кроме того, увеличивается строковое содержание самих данных на китайском и английском языках, что приводит к большому объему затрат на расчет и передачу данных.

Наша основная идея — избежать расширения данных и одновременно сократить размер передаваемых данных. Поэтому мы думаем, можем ли мы принять схему разметки данных, аналогичную разметке пользователей, сначала выполнить дедупликацию данных для генерации промежуточных данных с степенью детализации UID и в то же время разрешить обратное присоединение требуемой комбинации результирующих измерений к степени детализации UID. В этом процессе запишите количество измерений результатов и используйте меньшие структуры данных для их хранения, чтобы избежать передачи больших объемов данных в процессе расчета данных. В течение всего процесса расчета данных объем данных теоретически сходится постепенно и не будет увеличиваться за счет увеличения комбинаций статистических размерностей.

4.1.Основная идея

Основная идея расчета показана выше. Обычный метод расчета куба расширения данных требует расширения и повторного агрегирования данных. Число комбинированных измерений, необходимых для получения статистики результатов, кратно расширению данных, так же, как «провинция, провинция + город». " выше. Если объединить два измерения, ожидается, что данные увеличатся в 2 раза.

Новый метод агрегирования данных использует определенную стратегию, позволяющую разобрать комбинацию измерений на небольшие таблицы измерений и нумеровать их, а затем агрегировать конкретные подробные данные о том, какие заказы выполняются, в детализированные пользователем промежуточные данные процесса, в которых различные измерения комбинаций преобразуются в цифровые метки. Записанные в пользовательские записи данных, объем данных во всем процессе вычислений сжимается и агрегируется, а не увеличивается.

4.2 Логическая реализация

  • Подробная подготовка данных. В качестве примера можно привести данные об автономных платежах пользователя. Подробные записи включают номер заказа, идентификатор пользователя, дату платежа, провинцию, конечный город и сумму платежа. Требование статистики индикатора заключается в подсчете многомерного куба, содержащего объединенные измерения провинции и города + количество платящих пользователей.
номер заказа ID пользователя дата платежа Провинция Город К оплате
2023111101 U001 2023-11-11 Провинция Чжэцзян Ханчжоу город 1.11
2023111102 U001 2023-11-11 Провинция Чжэцзян Шаосин город 2.22
2023111103 U002 2023-11-11 Провинция Чжэцзян Ханчжоу город 3.33
2023111104 U003 2023-11-11 Провинция Цзянсу Нанкин город 4.44
2023111105 U003 2023-11-11 Провинция Чжэцзян город Вэньчжоу 5,55
2023111106 U004 2023-11-11 Провинция Цзянсу Нанкин город 6,66

Общий ход программы выглядит следующим образом.

  • ШАГ 1: Извлеките необходимые элементы из подробных данных (т. е. сгруппируйте по соответствующему полю), чтобы получить набор измерений.

  • ШАГ 2: Создайте куб из полученного набора измерений и закодируйте строки куба материала (при условии, что требуются два комбинированных измерения провинции, провинции + города ), которые можно реализовать с помощью функции куба ODPS, а затем отсортировать по сгенерированная комбинация измерений куба. Сгенерируйте уникальный код.
Исходное измерение: провинция Исходное измерение: провинция Размерность куба: провинция Размерность куба: город Идентификатор строки куба (может быть создан путем сортировки)
Провинция Чжэцзян Ханчжоу город Провинция Чжэцзян все 1
Провинция Чжэцзян Ханчжоу город Провинция Чжэцзян Ханчжоу город 2
Провинция Чжэцзян Шаосин город Провинция Чжэцзян все 1
Провинция Чжэцзян Шаосин город Провинция Чжэцзян Шаосин город 3
Провинция Чжэцзян город Вэньчжоу Провинция Чжэцзян все 1
Провинция Чжэцзян город Вэньчжоу Провинция Чжэцзян город Вэньчжоу 4
Провинция Цзянсу Нанкин город Провинция Цзянсу все 5
Провинция Цзянсу Нанкин город Провинция Цзянсу Нанкин город 6
  • ШАГ 3: Закодируйте строки куба и запишите их обратно в данные пользователя в соответствии с отношениями сопоставления. Это можно реализовать с помощью Mapjoin.
номер заказа ID пользователя дата платежа Провинция Город Агрегированный идентификатор куба
2023111101 U001 2023-11-11 Провинция Чжэцзян Ханчжоу город [1,2]
2023111102 U001 2023-11-11 Провинция Чжэцзян Шаосин город [1,3]
2023111103 U002 2023-11-11 Провинция Чжэцзян Ханчжоу город [1,2]
2023111104 U003 2023-11-11 Провинция Цзянсу Нанкин город [5,6]
2023111105 U003 2023-11-11 Провинция Чжэцзян город Вэньчжоу [1,4]
2023111106 U004 2023-11-11 Провинция Цзянсу Нанкин город [5,6]
  • ШАГ 4. Подведите итоги к пользовательскому измерению, визуализируйте поле набора идентификаторов куба, чтобы удалить дубликаты (вы можете использовать DISTINCT массива).

  • ШАГ5: Рассчитайте количество в соответствии с идентификатором куба (поскольку ШАГ 4 уже удалил дублирование, нет необходимости удалять дублирование здесь); затем восстановите измерения в соответствии с отношениями отображения.
Идентификатор куба Индикатор количества пользователей, размещающих заказы Размерность восстановления куба: провинция Размер восстановления куба: город
1 3 Провинция Чжэцзян все
2 2 Провинция Чжэцзян Ханчжоу город
3 1 Провинция Чжэцзян Шаосин город
4 1 Провинция Чжэцзян город Вэньчжоу
5 2 Провинция Цзянсу все
6 2 Провинция Цзянсу Провинция Цзянсу
  • Конец~

4.3.Реализация кода

WITH 
-- 基本的明细数据表准备
base_dwd AS (
  SELECT   pay_no
          ,user_id
          ,gmt_pay
          ,pay_amt
          ,prov_name
          ,prov_code
          ,city_name
          ,city_code
  FROM tmp_user_pay_order_detail
)
-- 生成多维Cube,并进行编码
,dim_cube AS (
  -- Step02:CUbe生成
  SELECT *,DENSE_RANK() OVER(PARTITION BY 1 ORDER BY cube_prov_name,cube_city_name) AS cube_id 
  FROM (
    SELECT dim_key
          ,COALESCE(IF(GROUPING(prov_name) = 0,prov_name,'ALL'),'na') AS cube_prov_name             
          ,COALESCE(IF(GROUPING(city_name) = 0,city_name,'ALL'),'na') AS cube_city_name 
    FROM (
      -- Step01:维度统计
        SELECT  CONCAT(''
                       ,COALESCE(prov_name ,''),'#' 
                       ,COALESCE(city_name     ,''),'#' 
                ) AS dim_key
                ,prov_name
                ,city_name
        FROM base_dwd
        GROUP BY prov_name
        ,city_name
    ) base
    GROUP BY dim_key
            ,prov_name
              ,city_name
    GROUPING SETS (
           (dim_key,prov_name)
          ,(dim_key,prov_name,city_name)
    )
  )
)
-- 将CubeID回写到明细记录上,并生成UID粒度的中间过程数据
,detail_ext AS (
  -- Step04:指标统计
  SELECT   user_id
          ,ARRAY_DISTINCT(SPLIT(WM_CONCAT(';',cube_ids),';')) AS cube_id_arry
  FROM (
    -- Step03:CubeID回写明细
    SELECT  /*+ MAPJOIN(dim_cube) */ 
          user_id
        ,cube_ids
    FROM (
        SELECT   user_id
                ,CONCAT(''
                       ,COALESCE(prov_name,''),'#' 
                      ,COALESCE(city_name,''),'#' 
                 ) AS dim_key
        FROM base_dwd
    ) dwd_detail
    JOIN (
        SELECT dim_key,WM_CONCAT(';',cube_id) AS cube_ids
        FROM dim_cube 
        GROUP BY dim_key
    ) dim_cube
    ON dwd_detail.dim_key = dim_cube.dim_key
  ) base
  GROUP BY user_id
)
-- 指标汇总并将CubeID翻译回可理解的维度
,base_dws AS (
  -- Step05:CubeID翻译
  SELECT cube_id
        ,MAX(prov_name) AS prov_name
        ,MAX(city_name    ) AS city_name
        ,MAX(uid_cnt      ) AS user_cnt
  FROM (
      SELECT cube_id              AS cube_id
            ,COUNT(1)             AS uid_cnt
            ,CAST(NULL AS STRING) AS prov_name
            ,CAST(NULL AS STRING) AS city_name
      FROM detail_ext
      LATERAL VIEW EXPLODE(cube_id_arry) arr AS cube_id
      GROUP BY cube_id
      UNION ALL 
      SELECT CAST(cube_id AS STRING) AS cube_id
            ,CAST(NULL AS BIGINT) AS uid_cnt
            ,cube_prov_name       AS prov_name
            ,cube_city_name       AS city_name    
      FROM dim_cube
  ) base 
  GROUP BY cube_id
)
-- 大功告成,输出结果!!!
SELECT   prov_name
        ,city_name
        ,user_cnt
FROM base_dws
;
  • Фактический процесс выполнения (просмотр журнала ODPS) показан ниже.

4.4.Экспериментальные результаты

Слева — новый склад на базе решения для маркировки Cube. В процессе эксперимента экспериментальные данные были увеличены с 10 миллиардов до 20 миллиардов, а количество размерностей комбинаций увеличено с исходных 25 до 50. Вся операция заняла 18 минут.Если бы только данные с таким же количеством и размерностями комбинаций, как исходные данные были рассчитаны, общий прогон расчета можно контролировать в течение 10 минут.

Справа — старый склад, рассчитанный на основе данных по инфляции. Экспериментальные данные установлены на уровне 10 миллиардов, количество измерений комбинаций — 25, промежуточные данные расширятся до 130 миллиардов+, размер данных резко увеличится до 1ТБ+, а общая операция займет 47 минут. Если это решение будет расширено до 20 миллиардов данных x 50 комбинационных измерений нового метода, данные промежуточного процесса расширятся до 400 миллиардов+, размер данных увеличится до 3ТБ+, а общий показатель вычислений достигнет 2,5+ часов.

Новый метод теперь запущен в заказах на основные бизнес-лиды. Благодаря сочетанию статистических параметров данных и значительного увеличения объема вычислений, общая боковая стенка основного индикатора выполняется более чем на 1 час вперед, что дополнительно эффективно гарантирует, что основные показатели данные стабильны.

4.5. Краткое описание плана

Для распространенных методов расчета куба, основанных на расширенных данных, размер расчета данных и объем передачи обрабатываемых данных будут линейно увеличиваться с количеством объединенных измерений. Чем больше объединенных измерений, тем больше ресурсов и траекторий движения потребляется при расширении данных и передаче в случайном порядке. эксперимент, 10 миллиардов экспериментальных данных x 25 сценариев комбинаций измерений, процесс обработки данных расширился до 130 миллиардов+, а размер данных увеличился со 100 ГБ до 1 ТБ. Когда объем данных и количество комбинаций измерений еще больше увеличиваются, весь процесс расчета в принципе сложно выполнить.

Чтобы решить проблему большого количества данных процесса, генерируемых в процессе расширения данных, мы действуем в обратном порядке, основываясь на идее маркировки данных.Сначала данные агрегируются в степень детализации UID.В процессе требуемая комбинация измерений преобразуется в кодированные числа и присваивается подробным данным.Все данные процесса расчетаВ форме конвергенции и агрегирования процесс расчета данных является стабильным и не будет резко увеличиваться по мере дальнейшего увеличения комбинации измерений. В ходе эксперимента экспериментальные данные были увеличены с 10 миллиардов до 20 миллиардов+, размеры комбинаций были увеличены с исходных 25 до 50, а общая операция контролировалась примерно за 18 минут. Если используется тот же объем данных и используется старая схема расширения данных, данные промежуточного процесса расширятся до 400 миллиардов+, размер данных увеличится до 3ТБ+, а общее время выполнения вычислений достигнет 2,5 часов+.

Подводя итог, можно сказать, что общая производительность текущего решения действительно выше, чем улучшения, достигнутые в прошлом, и не будет значительно увеличиваться с увеличением комбинаций размеров. Однако текущее решение имеет и недостатки, а именно понятность и ремонтопригодность кода.Хотя процесс расчета маркировки не фиксирован, но требует процесса инициализации процесса и понимания в целом.На данный момент невозможно реализовать обычный UnionAll/ Cube и другие решения легко читать и писать. Кроме того, когда количество объединенных измерений очень мало (т. е. кратность расширения данных невелика), разница в производительности между ними невелика. В это время рекомендуется использовать исходное обычное решение для расчета куба. ; но когда количество объединенных измерений достигает десятков раз, вы можете Идея использования этого метода данных для изменения показателей сжимается. Ведь преимущество в производительности в это время начинает становиться заметным, а количество измерений комбинации взвешиваются.Это решение имеет большие преимущества в производительности.

5. Другие варианты

BitMap-решение. Основная идея заключается в использовании неаддитивных показателей данных через кумулятивно рассчитанную структуру данных для приблизительного достижения эффекта кумулятивных показателей. Конкретный план процесса реализации заключается в кодировании идентификатора пользователя и сохранении его в структуре BitMap.Например, двоичный бит указывает, существует ли пользователь и потребляет 1 бит. Когда статистика измерения сводится, структура данных BitMap объединяется и подсчитывается.

Решение HyperLogLog. По сравнению с точной дедупликацией Distinct производительность неточной дедупликации данных значительно улучшена.

Производительность этих двух решений значительно улучшена по сравнению с обычными вычислениями Cube, но решение BitMap требует кодирования и хранения UID, используемого для статистики дедупликации, что для обычных пользователей является более дорогостоящим для понимания и реализации, если оно не интегрировано на уровне системы. Функциональность, реализация которой в противном случае обычно требовала бы дополнительной разработки кода. Основным недостатком решения HyperLogLog является неточная статистика данных.

Автор|Jiaer

Исходная ссылка

Эта статья является оригинальным контентом Alibaba Cloud и не может быть воспроизведена без разрешения.

Broadcom объявила о прекращении существующей партнерской программы VMware . Сайт B дважды выходил из строя, инцидент Tencent "3.29" первого уровня... Подводя итоги десяти крупнейших инцидентов с простоями в 2023 году, выпущен Vue 3.4 "Slam Dunk", Yakult подтвердил утечку данных 95G MySQL 5.7, Moqu, Li Tiaotiao... Подведение итогов проектов и веб-сайтов с открытым исходным кодом, которые будут «остановлены» в 2023 году. Официально выпущен «Отчет разработчиков открытого исходного кода Китая за 2023 год». Оглядываясь назад на IDE 30 лет назад: только TUI, яркий цвет фона…… Официально выпущена Julia 1.10 Выпущена Rust 1.75.0 NVIDIA выпустила GeForce RTX 4090 D специально для продажи в Китае
{{o.name}}
{{м.имя}}

Supongo que te gusta

Origin my.oschina.net/yunqi/blog/10560406
Recomendado
Clasificación