• A
  • A
  • A
  • АБВ
  • АБВ
  • АБВ
  • А
  • А
  • А
  • А
  • А
Обычная версия сайта

Агрегатные функции для геотипов в ClickHouse

Выполнил: Жемуков Альберт Артурович

В ClickHouse есть геометрические типы и скалярные функции над ними, но агрегатов для пространственных данных до сих пор не было — объединить полигоны по ключу или построить выпуклую оболочку по группе точек средствами оператора GROUP BY было невозможно. Между тем такие операции нужны, например, для вычисления общих зон покрытия или границ маршрутов по большим таблицам событий. В работе реализованы три таких агрегата: построения выпуклой оболочки, объединения полигонов и пересечения полигонов.

Функции работают как полноценные агрегаты ClickHouse — с сериализацией состояний, слиянием частичных результатов и поддержкой комбинаторов сохранения и слияния состояний. Это означает, что они пригодны для распределённого выполнения, а не только для локальных запросов. Агрегат построения выпуклой оболочки принимает любые геометрические типы, от точки до обобщённой геометрии, и возвращает кольцо. Два полигональных агрегата принимают кольца, полигоны, мультиполигоны и их обобщённые варианты, а возвращают мультиполигон. Вычислительное ядро — уже присутствующая в дереве проекта библиотека Boost.Geometry. Новые внешние зависимости не добавлены.

Корректность проверена набором автономных SQL-тестов, который покрывает базовые сценарии, ошибки типов и координат, сохранение и слияние состояний, смешанные варианты геометрий и устойчивость к повреждённым состояниям. В реализацию также входят документационные заготовки для каждой функции. Для оценки производительности подготовлен воспроизводимый пакет бенчмарков. Замеры на синтетических данных подтвердили эффективность заложенных оптимизаций: промежуточного сжатия буфера точек, попарной редукции полигонов и раннего выхода при пустом пересечении.

Руководитель проекта:

Каледин Максим Львович

Департамент больших данных и информационного поиска: Доцент

Миловидов Алексей Николаевич


 

Нашли опечатку?
Выделите её, нажмите Ctrl+Enter и отправьте нам уведомление. Спасибо за участие!
Сервис предназначен только для отправки сообщений об орфографических и пунктуационных ошибках.