Каков наиболее эффективный способ вычисления «колокейшн» в BigQuery? - PullRequest
0 голосов
/ 04 апреля 2020

Предполагая, что у вас есть таблица вида:

 vehicle_id | timestamp | lat | lon

Каков наиболее эффективный способ создания запроса для вычисления «колокейшн»? «Колокейшн» означает, что два транспортных средства находятся в почти одном и том же месте одновременно.

Что я делаю, это сначала создаю cell_id из сетки (например, созданный округлением значения lat / lon до 4-го десятичного знака di git) а затем запустить groupby на cell_id (и время). Есть ли более эффективный способ?

1 Ответ

1 голос
/ 04 апреля 2020

Я бы предложил использовать GeoHa sh. Демонстрируя это на NY C данные такси и группировка по часам во времени:

WITH top_pickup_locations AS (
SELECT
  TIMESTAMP_TRUNC(pickup_datetime, HOUR) AS hour,
  ST_GeoHash( ST_GeogPoint(pickup_longitude, pickup_latitude), 15 ) AS geohash,
  COUNT(*) AS num_pickups
FROM `bigquery-public-data.new_york.tlc_green_trips_2013`
GROUP BY hour, geohash
ORDER BY num_pickups DESC
LIMIT 10
)
SELECT
  hour,
  ST_GeogPointFromGeoHash(geohash),
  num_pickups
FROM top_pickup_locations

Чтобы узнать больше о GeoHa sh, см. Здесь: https://en.wikipedia.org/wiki/Geohash Увеличьте количество символы (я использую 15) для контроля точности.

Другой альтернативой является использование ST_SnapToGrid () вместо geoha sh:

WITH top_pickup_locations AS (
SELECT
  TIMESTAMP_TRUNC(pickup_datetime, HOUR) AS hour,
  ST_ASGeoJson(ST_SnapToGrid( ST_GeogPoint(pickup_longitude, pickup_latitude), 0.0001)) AS cellid,
  COUNT(*) AS num_pickups
FROM `bigquery-public-data.new_york.tlc_green_trips_2013`
GROUP BY hour, cellid
ORDER BY num_pickups DESC
LIMIT 10
)
SELECT
  hour,
  ST_GeogFromGeoJson(cellid),
  num_pickups
FROM top_pickup_locations

Когда я это сделал, метод geoha sh занимал 11 секунд времени слота, в то время как метод привязки к сетке занимал 57 секунд времени слота. 15 символов геоха sh и 4 цифры лат-лона примерно одинаковы по количеству групп.

...