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

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

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

В вашем списке полей, которые либо импортируются по их уникальному имени, либо создаются во время приема с использованием функции преобразования, вам необходимо указать поля широты и долготы, как показано выше (lon, lat). . Здесь нет ничего особенного, но вам нужно будет сгенерировать новое поле для выполнения геопространственных запросов в реальном времени по этим полям. Вам нужно будет создать новое поле, которое я назвал location_st_point в приведенном ниже фрагменте.

К вашему сведению - оба этих фрагмента взяты из одного и того же блока конфигурации в вашем файле определения схемы.

Теперь, когда мы добавили необходимые биты в файл конфигурации схемы, мы можем перейти к обновлению конфигурации таблицы, которая ссылается на приведенную выше схему. Изменения здесь простые, их можно увидеть ниже. В будущих версиях могут быть некоторые изменения, поэтому всегда полезно перейти к самой последней версии документации Apache Pinot.

  • Тип индекса для location_st_point установлен на H3, который мы подробно рассмотрим позже.
  • resolutions, указанный в приведенной выше конфигурации таблицы Пино, увеличивает количество уникальных индексов в зависимости от выбранного вами значения. Для значения resolutions: "5" Пино создаст примерно 2 016 842 уникальных индексов.
  • Дополнительную информацию о свойстве resolutions можно найти в следующем ресурсе, который описывает компромисс при индексировании для разреженной и грубой точности во время запроса: Таблица областей ячеек для разрешений H3

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

Понимание геопространственных запросов в Пино

Геопространственная реализация в Pinot основана на проекте H3 с открытым исходным кодом, созданном в Uber. Как известно большинству пользователей или водителей Uber или UberEats, весь их бизнес в значительной степени зависит от анализа расстояния между пассажирами, водителями, ресторанами и пунктами доставки еды в пространственной геометрии реального мира. Это потребовало инновационного решения для геопространственных запросов в реальном времени с ультра-масштабируемыми требованиями. Чтобы ответить на этот вызов, инженеры Uber создали решение под названием Гексагональная иерархическая система геопространственного индексирования или сокращенно H3.

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

Ресурсы документации для H3 и его реализации Apache Pinot можно найти по следующим ссылкам:

Геопространственные SQL-запросы в Apache Pinot

В запросе Apache Pinot, показанном ниже, у нас есть простой поиск SQL, чтобы найти магазины Starbucks в районе залива Сан-Франциско. Центральная точка определяется в этом запросе с помощью функции Pinot ST_POINT(x,y,isGeometry) .

В запросе вы можете видеть, что функция ST_POINT имеет три параметра. Третий параметр - это значение boolean, которое указывает, должна ли центральная точка для этого запроса расстояния измеряться с использованием геометрии или географии. . В документации Пино подробно объясняется, как геометрия и география играют роль в определении геопространственных координат. Вы также можете найти ссылку на исходный код для его реализации здесь.

Почему шестиугольники?

На изображении ниже показан пример того, как шестиугольники могут быть несжатыми и уплотненными, что лежит в основе методики индексации, используемой H3. Там, где есть много плотных координат, сжатых географически на небольших участках, например, в случае в больших городах, таких как Сан-Франциско, разрешение границ шестиугольника может быть увеличено в количестве.

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

Ресурсы по геопространственной индексации H3

Есть несколько отличных ресурсов, чтобы узнать больше о том, как геоиндексирование H3 работает под капотом. Я настоятельно рекомендую эту заметную записную книжку, в которой исследуется, как работает уплотнение для различных значений свойства resolutions в конфигурации таблицы Пино.

Чтобы понять компромиссы при индексировании для resolutions с использованием индексации H3, взгляните на следующую таблицу ресурсов.

Существует также отличный интерактивный пример Observable, объясняющий основы H3, который стоит посмотреть тем, кто плохо знаком с этим видом геопространственного индексирования.

Наконец, вот отличная презентация команды разработчиков открытого исходного кода Uber, которая знакомит вас с H3 и геоиндексированием.

Специальная благодарность

Приятно иметь возможность исследовать удивительную работу коммиттеров Apache Pinot, которые делают эти функции возможными. Я хотел бы поблагодарить Yupeng Fu за соавторство этого сообщения в блоге со мной. Его работа над проектной документацией - это произведение искусства, и меня по-настоящему взволновала эта новая функция для Пино.

Большое спасибо инженерам и специалистам по данным в Uber, которые открыли исходный код как для своего кода на H3, так и для своей философии дизайна.

Если у вас есть какие-либо вопросы о внедрении геопространственной индексации в ваше приложение Pinot, обращайтесь сюда или на наш канал Slack сообщества.

Дополнительные учебные ресурсы