2015-02-10 3 views
1

Я продолжаю получать ресурсы за следующий запрос. Я пробовал работать в пакетном режиме и из командной строки, и ничего не работает. У кого-нибудь есть идеи?Ресурсы превышены в BigQuery

SELECT num, extid, amount, note, balance FROM ( SELECT row_number() over(partition by extid order by stamp) as num , extid, stamp, ds, amount, note, balance FROM monte.ledger2_trailing_21d WHERE ds >= '2015-02-09' ORDER BY extid, stamp ) WHERE num <= 10 limit 300

ответ

4

Это обманчиво дорогим запроса; Анализ таймсеров всегда бывает трудным в подобных SQL-средах. Приведенный вами текст PARTITION BY требует, чтобы все данные для одного extid присутствовали в памяти на одной машине, что перегружает его и приводит к превышению ваших ресурсов.

Вы можете уменьшить эту потребность в ОЗУ с помощью предложения ROWS, чтобы ограничить область вашего раздела. Ниже приведен пример:

SELECT extid, stamp, ds, amount, note, balance 
FROM (
    SELECT 
    extid, stamp, ds, amount, note, balance, 
    MAX(tenth_stamp) OVER(PARTITION BY extid) AS target_stamp 
    FROM (
    SELECT extid, stamp, ds, amount, note, balance, 
     MIN(stamp) OVER (
     PARTITION BY extid 
     ORDER BY stamp DESC 
     ROWS BETWEEN CURRENT ROW AND 9 FOLLOWING 
    ) AS tenth_stamp 
    FROM 
     [monte.ledger2_trailing_21d] 
    WHERE ds >= '2015-02-09' 
) 
) 
WHERE stamp >= target_stamp 
ORDER BY extid, stamp 
LIMIT 300 

самого внутреннего суб-выбора извлекает ваши данные и поле tenth_stamp, который содержит наименьшее печать 10 рядов исследованных. Использование MIN() делает эту работу даже тогда, когда для любого заданного extid существует менее 10 строк.

Средний подвыбор найден наибольшим tenth_stamp за каждые extid. Это десятый общий штамп для этого extid. Внешний SELECT затем может ограничивать результат только строками с stamp в десяти последних stamp для их соответствующих extid, что дает желаемый результат.

Выполняется в общей сложности 4 этапа. Он не будет работать быстро, но никогда не требует больших объемов данных в одном месте. Надеюсь, это поможет!

+0

Спасибо, что указали предложение Rows. Мне все еще нужно было сделать row_number во внешнем запросе, чтобы проанализировать порядок взаимодействия пользователей с событиями, но теперь он работает без проблем. Кроме того, вы могли бы отредактировать мою учетную информацию из своего ответа. Я бы предпочел не иметь полный путь к файлу, указанный в открытом форуме. – PData

+0

FYI Matthew - инженер BigQuery, имеющий доступ к журналам запросов, на случай, если вам интересно, как он нашел ваш идентификатор проекта (и непреднамеренно добавил его к ответу). –

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