2013-06-28 2 views
1

У нас есть более 100 м строк в большом запросе данных аналитики. Каждая запись - это событие, прикрепленное к идентификатору.сглаживание данных о событиях в большом запросе с одним запросом

Упрощение ..

ID ИдСобытия Отметка

Можно ли сгладить это одна таблица строк, занимающих как ..

ID-метка времени период event1 event2 event3 event4

Где столбцы событий содержат подсчет количества событий для этого идентификатора за этот период времени?

До сих пор мне удалось сделать это на небольших наборах данных с 2 запросами. Один для создания строк, которые содержат подсчеты для отдельного идентификатора события, а другой - для выравнивания их в одну строку после. Причина, по которой я еще не смог сделать это по всему набору данных, заключается в том, что в bigquery заканчиваются ресурсы - не совсем понятно, почему.

Эти два запроса выглядеть примерно так ..

SELECT 
VideoId, 
date_1, 
IF(EventId = 1, INTEGER(count), 0) AS user_play, 
IF(EventId = 2, INTEGER(count), 0) AS auto_play, 
IF(EventId = 3, INTEGER(count), 0) AS pause, 
IF(EventId = 4, INTEGER(count), 0) AS replay, 
IF(EventId = 5, INTEGER(count), 0) AS stop, 
IF(EventId = 6, INTEGER(count), 0) AS seek, 
IF(EventId = 7, INTEGER(count), 0) AS resume, 
IF(EventId = 11, INTEGER(count), 0) AS progress_25, 
IF(EventId = 12, INTEGER(count), 0) AS progress_50, 
IF(EventId = 13, INTEGER(count), 0) AS progress_75, 
IF(EventId = 14, INTEGER(count), 0) AS progress_90, 
IF(EventId = 15, INTEGER(count), 0) AS data_loaded, 
IF(EventId = 16, INTEGER(count), 0) AS playback_complete, 
IF(EventId = 30, INTEGER(count), 0) AS object_click, 
IF(EventId = 31, INTEGER(count), 0) AS object_rollover, 
IF(EventId = 32, INTEGER(count), 0) AS object_clickthrough, 
IF(EventId = 33, INTEGER(count), 0) AS object_shown, 
IF(EventId = 34, INTEGER(count), 0) AS object_close, 
IF(EventId = 40, INTEGER(count), 0) AS logo_clickthrough, 
IF(EventId = 41, INTEGER(count), 0) AS endframe_clickthrough, 
IF(EventId = 42, INTEGER(count), 0) AS startframe_clickthrough, 
IF(EventId = 61, INTEGER(count), 0) AS share_facebook, 
IF(EventId = 62, INTEGER(count), 0) AS share_twitter, 
IF(EventId = 63, INTEGER(count), 0) AS open_social_panel, 
IF(EventId = 70, INTEGER(count), 0) AS embed_code_requested, 
IF(EventId = 80, INTEGER(count), 0) AS player_impression, 
IF(EventId = 81, INTEGER(count), 0) AS player_loaded, 
IF(EventId = 90, INTEGER(count), 0) AS html5_impression, 
IF(EventId = 91, INTEGER(count), 0) AS html5_load, 
IF(EventId = 95, INTEGER(count), 0) AS fallback_impression, 
IF(EventId = 96, INTEGER(count), 0) AS fallback_load, 
IF(EventId = 152, INTEGER(count), 0) AS object_impression, 
IF(EventId = 200, INTEGER(count), 0) AS ping, 
IF(EventId = 250, INTEGER(count), 0) AS facebook_clickthrough, 
IF(EventId = 251, INTEGER(count), 0) AS twitter_clickthrough, 
IF(EventId = 252, INTEGER(count), 0) AS other_clickthrough, 
IF(EventId = 253, INTEGER(count), 0) AS qr_clickthrough, 
IF(EventId = 254, INTEGER(count), 0) AS banner_clickthrough, 
IF(EventId = 280, INTEGER(count), 0) AS banner_impression, 
IF(EventId = 281, INTEGER(count), 0) AS banner_loaded, 
IF(EventId = 282, INTEGER(count), 0) AS banner_data_loaded, 
IF(EventId = 284, INTEGER(count), 0) AS banner_forward, 
IF(EventId = 285, INTEGER(count), 0) AS banner_back, 
IF(EventId = 300, INTEGER(count), 0) AS mobile_preview_loaded, 
IF(EventId = 301, INTEGER(count), 0) AS mobile_preview_clickthrough, 
IF(EventId = 302, INTEGER(count), 0) AS mobile_preview_clickthrough_back, 
IF(EventId = 310, INTEGER(count), 0) AS product_search_click, 
IF(EventId = 311, INTEGER(count), 0) AS promo_code_click, 
IF(EventId = 320, INTEGER(count), 0) AS player_share_facebook, 
IF(EventId = 321, INTEGER(count), 0) AS player_share_twitter, 
IF(EventId = 322, INTEGER(count), 0) AS player_share_googleplus, 
IF(EventId = 323, INTEGER(count), 0) AS player_share_email, 
IF(EventId = 324, INTEGER(count), 0) AS player_share_embed, 
IF(EventId = 401, INTEGER(count), 0) AS youtube_error_2, 
IF(EventId = 402, INTEGER(count), 0) AS youtube_error_100, 
IF(EventId = 403, INTEGER(count), 0) AS youtube_error_101, 
FROM 
(
SELECT 
    VideoId, EventId, count(*) as count, Date(timestamp) as date_1 
FROM [data.data_1] 
GROUP EACH BY VideoId, EventId, date_1 
) 
ORDER BY data_loaded DESC; 

Тогда просто группа по по идентификатору и метки времени создает полную сводную таблицу.

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

Спасибо заранее, Mat

ответ

1

Я предполагаю, что вы бежите из ресурсов, из-за ORDER BY в конце. Все остальное должно быть сделано параллельно. Также обратите внимание, что если вы удалите заказ, вы сможете использовать флаг «разрешить большие результаты» и выписать большую таблицу результатов (если результаты> 128 МБ).

+0

Работали как очарование. Большое спасибо. –