【发布时间】:2019-03-25 18:58:05
【问题描述】:
我正在 BigQuery 中根据来自外部网站的事件数据计算会话表。事件表有大约 1200 万个事件(非常小)。在添加创建会话的逻辑后,我想对所有会话求和并分配一个 global_session_id。我正在使用 sum()over(order by...) 子句来执行此操作,该子句引发资源超出错误。我知道 order by 子句导致所有数据在单个节点上处理,这导致计算资源被超出,但我不确定我可以对我的代码进行哪些更改以达到相同的结果。非常感谢任何解决方法、建议或解释。
with sessions_1 as ( /* Tie a visitor's last event and last campaign to current event. */
select visitor_id as session_user_id,
sent_at,
context_campaign_name,
event,
id,
LAG(sent_at,1) OVER (PARTITION BY visitor_id ORDER BY sent_at) as last_event,
LAG(context_campaign_name,1) OVER (PARTITION BY visitor_id ORDER BY sent_at) as last_event_campaign_name
from tracks_2
),
sessions_2 as ( /* Flag events that begin a new session. */
select *,
case
when context_campaign_name != last_event_campaign_name
or context_campaign_name is null and last_event_campaign_name is not null
or context_campaign_name is not null and last_event_campaign_name is null
then 1
when unix_seconds(sent_at)
- unix_seconds(last_event) >= (60 * 30)
or last_event is null
then 1
else 0
end as is_new_session
from sessions_1
),
sessions_3 as ( /* Assign events sessions numbers for total sessions and total user sessions. */
select id as event_id,
sum(is_new_session) over (order by session_user_id, sent_at) as global_session_id
#sum(is_new_session) over (partition by session_user_id order by sent_at) as user_session_id
from materialized_result_of_sessions_2_query
)
select * from sessions_3
【问题讨论】:
-
样本数据、期望的结果以及对会话定义的描述会很有帮助。
-
会话定义是 30 分钟不活动窗口或当用户通过不同的广告访问网站时。
-
期望的结果是一个包含所有唯一事件 api id、每个会话的唯一 id 以及给定用户的第 n 个会话的字段的表。处理示例数据。
-
为什么唯一的 id 必须是一个连续的值?或者这不是一个要求?
-
@GordonLinoff 如果它不是一个顺序值,它将影响我们在下游所做的一些配置,所以理想情况下我想保留顺序值。我知道一种可能的解决方案可能是通过组合 user_id 和会话开始日期来创建 global_session_id,但想先看看是否可以使用顺序值。
标签: sql google-bigquery window-functions