Как BigQuery выполняет пространственные объединения? - PullRequest
2 голосов
/ 10 июля 2019

Из официальных документов мы читаем, что LEFT / RIGHT / FULL OUTER JOINS не оптимизированы для пространственных данных.Я выполнил несколько длинных запросов, которые используют сложные объединения для GEOGRAPHY типов данных.

Мой вопрос заключается в том, как BigQuery справляется с объединением пространственных данных под капотом?Все конвертировано в геохашу?

Я пытался кластеризовать свою таблицу по столбцу типа GEOGRAPHY, но пока улучшения скорости были незначительными.

Если я использую Geohash (STRING) в предложении where для JOIN вместо типа GEOGRAPHY, это приводит к увеличению производительности?

Вот пример того, о чем я говорю:

select t1.Geohash, t1.Name, t1.Way, t1.Long, t1.Lat, t1.CoreInt
       , t1.Label, t1.IntLat, t1.IntLong
       , row_number() over(partition by Geohash order by Dist) as RowNum
       , Distance
  from table_name t1
  left outer join (select Geohash, Label from table where CoreInt = 1) t2 
 using (Geohash)
 where t2.Label is null
    or t1.Label = t2.Label

Спасибо

1 Ответ

5 голосов
/ 10 июля 2019

Да, BigQuery еще не оптимизирует пространственные соединения LEFT / RIGHT / OUTER.

На данный момент вам необходимо преобразовать такие объединения в INNER JOIN + выбрать несоответствующие строки, см. Этот вопрос, например: Как присоединиться к столбцам географии, используя ST_CONTAINS в большом запросе

Внутренне BigQuery использует индексацию S2. Это может быть быстрее или медленнее, чем присоединение к геохэшу, в зависимости от данных. Но в отличие от join на geohash это гарантирует правильный результат.

Присоединение к Geohash имеет две основные проблемы:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...