2015-10-22 2 views
3

Я пытаюсь запустить запрос в BigQuery, но получаю «Ресурсы, превышаемые во время выполнения запроса».Оптимизировать запрос в BigQuery

На самом деле, у меня есть две таблицы:

Table user: 
Id | User | Latitude | Longitude 
1 | 1  | 50.83 | 4.01 
2 | 1  | 50.84 | 4.03 
3 | 2  | 48.78 | 2.87 
4 | 3  | 47.42 | 8.53 
… 
Table point_of_interest: 
Id | Latitude | Longitude | Range | Tag 
1 | 50.81 | 3.98  | 0.05 | a;b;c;d 
2 | 50.85 | 4.03  | 0.025 | a;c;e;f 
3 | 40.80 | 3.87  | 0.04 | a;d;g 
4 | 47.42 | 8.57  | 0.08 | b 
… 

Цель состоит в том, чтобы соединить таблицы, чтобы пометить все пользовательские с широтой, долготой и Range.

Для этого я использовал этот запрос:

SELECT 
    u.User AS id, 
    GROUP_CONCAT(poi.Tag) AS tag 
FROM (
    SELECT 
    u.User, 
    poi.Tag, 
    FROM 
    [user] u 
    CROSS JOIN 
    [point_of_interest] poi 
    WHERE 
    u.Latitude BETWEEN poi.Latitude – poi.Range AND poi.Latitude + poi.Range 
    AND 
    u.Longitude BETWEEN poi.Longitude – poi.Range AND poi.Longitude + poi.Range) 
GROUP BY 
    id 

В таблице пользователя в настоящее время 520 MB и таблица point_of_interest только 565 КБ, но, вероятно, расти в то время.

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

EDIT:

Я также попытался использовать диапазон LEFT JOIN EACH однако BigQuery поддерживают только операторы равенства после ON ключевого слова.

+0

Не размер, но количество записей важно. Каково количество записей в каждой таблице? – Pentium10

+0

Вы пытались «GROUP EACH BY», вы все еще получаете Ресурсы? – Pentium10

+0

Я попробовал GROUP EACH BY и получил ту же ошибку. Таблица пользователей содержит 3 000 000 записей и таблицу point_of_interest 100 000. – Nexus

ответ

1

Вам нужно оштукатурить ваши столы и выполнить несколько меньших запросов.

Что-то вроде этого:

SELECT * FROM table WHERE ABS(HASH(id) % 100) == 0 
SELECT * FROM table WHERE ABS(HASH(id) % 100) == 1 
SELECT * FROM table WHERE ABS(HASH(id) % 100) == 2 
SELECT * FROM table WHERE ABS(HASH(id) % 100) == 3 
... 
SELECT * FROM table WHERE ABS(HASH(id) % 100) == 99 

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

Вы можете получить результат в той же таблице адресатов и сохранить отдельно от необработанных данных.

0

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

http://googlecloudplatform.blogspot.com/2014/03/geoip-geolocation-with-google-bigquery.html

StackO: How to improve performance of GeoIP query in BigQuery?

Btw, этот вопрос связан с одним публикуемыми позже (Tag huge list of elements with lat/long with large list of geolocation data)?

Смежные вопросы