Для доступа к данным Places Insights вы пишете SQL-запросы в BigQuery, которые возвращают агрегированные данные о местах. Результаты возвращаются из набора данных, соответствующего критериям поиска, указанным в запросе.
Требования к запросу
Оператор SELECT
в запросе должен включать WITH AGGREGATION_THRESHOLD
и указывать набор данных. Например:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `places_insights___us___sample.places_sample`
В этом примере вы используете FROM
для указания набора данных places_insights___us___sample.places_sample
для Соединенных Штатов.
Укажите ограничение по местоположению
Обратите внимание, что в предыдущем запросе не указано никаких ограничений по местоположению, что означает, что агрегация данных применяется ко всему набору данных. Обычно ограничение по местоположению указывается, как показано ниже:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `places_insights___us___sample.places_sample` WHERE ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000)
В этом примере ваш запрос задает целевое ограничение, сосредоточенное вокруг здания Эмпайр-стейт-билдинг в Нью-Йорке с радиусом 1000 метров.
Для задания области поиска можно использовать многоугольник. При использовании многоугольника его точки должны образовывать замкнутый контур, в котором первая точка совпадает с последней:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `places_insights___us___sample.places_sample` WHERE ST_CONTAINS(ST_GEOGFROMTEXT("""POLYGON((-73.985708 40.75773,-73.993324 40.750298, -73.9857 40.7484,-73.9785 40.7575, -73.985708 40.75773))"""), point)
В следующем примере область поиска определяется линией, состоящей из соединённых точек. Эта линия аналогична маршруту, рассчитанному с помощью Routes API . Маршрут может быть автомобильным, велосипедным или пешеходным:
DECLARE route GEOGRAPHY; SET route = ST_GEOGFROMTEXT("""LINESTRING(-73.98903537033028 40.73655649223003, -73.93580216278471 40.80955538843361)"""); SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `places_insights___us___sample.places_sample` WHERE ST_DWITHIN(route, point, 100)
В этом примере вы устанавливаете радиус поиска 100 метров вокруг линии.
Фильтр по полям набора данных места
Уточните поиск на основе полей, определенных схемой набора данных . Фильтруйте результаты по таким полям набора данных, как время regular_opening_hours
, price_level
и rating
клиента.
Укажите все поля в наборе данных, определённые схемой набора данных для интересующей вас страны. Схема набора данных для каждой страны состоит из двух частей:
- Основная схема , общая для наборов данных всех стран.
- Схема, специфичная для конкретной страны , которая определяет компоненты схемы, специфичные для этой страны.
Например, ваш запрос может включать предложение WHERE
, определяющее критерии фильтрации. В следующем примере возвращаются агрегированные данные для заведений типа restaurant
со business_status
, равным OPERATIONAL
, rating
не ниже 4,0 и параметром allows_dogs
, имеющим значение true
:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `places_insights___us___sample.places_sample` WHERE ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000) AND 'restaurant' IN UNNEST(types) AND business_status = "OPERATIONAL" AND rating >= 4.0 AND allows_dogs = true
Следующий запрос возвращает результаты для мест, где есть не менее восьми станций зарядки электромобилей:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `places_insights___us___sample.places_sample` WHERE ev_charge_options.connector_count > 8;
Фильтр по основному типу места и типу места
Каждое место в наборе данных может иметь:
Один основной тип , связанный с ним, из типов, определённых в таблице A. Например, основным типом может быть
mexican_restaurant
илиsteak_house
. Используйтеprimary_type
в запросе, чтобы отфильтровать результаты по основному типу места.С ним связано несколько значений типов, определённых в таблице A. Например, ресторан может иметь следующие типы:
seafood_restaurant
,restaurant
,food
,point_of_interest
,establishment
. Используйтеtypes
в запросе для фильтрации результатов по списку типов, связанных с этим местом.
Следующий запрос возвращает результаты для всех мест, которые в основном являются bar
, но также выполняют функции restaurant
:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `places_insights___us___sample.places_sample` WHERE 'restaurant' IN UNNEST(types) AND 'bar' = primary_type
Фильтр по предопределенным значениям данных
Многие поля набора данных имеют предопределенные значения. Например:
Поле
price_level
поддерживает следующие предопределенные значения:-
PRICE_LEVEL_FREE
-
PRICE_LEVEL_INEXPENSIVE
-
PRICE_LEVEL_MODERATE
-
PRICE_LEVEL_EXPENSIVE
-
PRICE_LEVEL_VERY_EXPENSIVE
-
Поле
business_status
поддерживает следующие предопределенные значения:-
OPERATIONAL
-
CLOSED_TEMPORARILY
-
CLOSED_PERMANENTLY
-
В этом примере запрос возвращает количество всех ресторанов со business_status
OPERATIONAL
в радиусе 1000 метров от Эмпайр-стейт-билдинг в Нью-Йорке:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `places_insights___us___sample.places_sample` WHERE ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000) AND business_status = "OPERATIONAL" AND 'restaurant' IN UNNEST(types)
Фильтр по часам работы
В этом примере вернем количество всех мест в географическом районе со счастливыми часами по пятницам:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `places_insights___us___sample.places_sample`, UNNEST(regular_opening_hours_happy_hour.friday) AS friday_hours WHERE '17:00:00' BETWEEN friday_hours.start_time AND friday_hours.end_time AND ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000);
Используйте функцию агрегации
В примере ниже показаны поддерживаемые функции агрегации BigQuery. Этот запрос агрегирует рейтинги всех мест в радиусе 1000 метров от Эмпайр-стейт-билдинг в Нью-Йорке для получения статистики рейтингов:
SELECT WITH AGGREGATION_THRESHOLD COUNT(id) AS place_count, APPROX_COUNT_DISTINCT(rating) as distinct_ratings, COUNTIF(rating > 4.0) as good_rating_count, LOGICAL_AND(rating <= 5) as all_ratings_equal_or_below_five, LOGICAL_OR(rating = 5) as any_rating_exactly_five, AVG(rating) as avg_rating, SUM(user_rating_count) as rating_count, COVAR_POP(rating, user_rating_count) as rating_covar_pop, COVAR_SAMP(rating, user_rating_count) as rating_covar_samp, STDDEV_POP(rating) as rating_stddev_pop, STDDEV_SAMP(rating) as rating_stddev_samp, VAR_POP(rating) as rating_var_pop, VAR_SAMP(rating) as rating_var_samp, FROM `places_insights___us___sample.places_sample` WHERE ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000) AND business_status = "OPERATIONAL"
Группы результатов возврата
Приведённые выше запросы возвращают одну строку в результатах, содержащую количество агрегаций для запроса. Вы также можете использовать оператор GROUP BY
для возврата нескольких строк в ответе на основе критериев группировки.
Например, следующий запрос возвращает результаты, сгруппированные по основному типу каждого места в области поиска:
SELECT WITH AGGREGATION_THRESHOLD primary_type, COUNT(*) AS count FROM `places_insights___us___sample.places_sample` WHERE ST_DWITHIN(ST_GEOGPOINT(-73.99992071622756, 40.71818785986936), point, 1000) GROUP BY primary_type
На следующем изображении показан пример вывода этого запроса:
В этом примере вы создаёте таблицу локаций. Для каждой локации вы вычисляете количество близлежащих ресторанов (то есть тех, что находятся в радиусе 1000 метров):
WITH my_locations AS ( SELECT 'Location 1' AS name, ST_GEOGPOINT(-74.00776440888504, 40.70932825380786) AS location UNION ALL SELECT 'Location 2' AS name, ST_GEOGPOINT(-73.98257192833559, 40.750738934863215) AS location UNION ALL SELECT 'Location 3' AS name, ST_GEOGPOINT(-73.94701794263223, 40.80792954838445) AS location ) SELECT WITH AGGREGATION_THRESHOLD l.name, COUNT(*) as count FROM `places_insights___us___sample.places_sample` p JOIN my_locations l ON ST_DWITHIN(l.location, p.point, 1000) WHERE primary_type = "restaurant" AND business_status = "OPERATIONAL" GROUP BY l.name
На следующем изображении показан пример вывода этого запроса: