UserActivitySummary_America/Los_Angeles_v2 数据源及汇总逻辑详解
1. 数据源说明
UserActivitySummary_America/Los_Angeles_v2 集合中的数据来源于定时任务调度程序(schedule)的处理结果。具体来说,数据源是经过层层处理后的 UserActivityStatistic 数据。
处理流程如下:
- 原始用户行为数据(UserActivity)→
- 会话处理后的数据(ProcessedUserActivity)→
- 统计数据(UserActivityStatistic)→
- 汇总数据(UserActivitySummary_America/Los_Angeles_v2)
2. 汇总逻辑详解
汇总逻辑主要在 _generate_summary_data 方法中实现,该方法位于 mongo_schedule.py 文件中。
2.1 数据分组
首先,按是否来自广告(fromAd)和文章ID(postId)对统计数据进行分组:
# 按是否来自广告和postId分组
grouped_data = defaultdict(lambda: defaultdict(list))
for stat in statistics:
from_ad = stat.get("fromAd", False)
post_id = stat.get("postId", "unknown")
grouped_data[from_ad][post_id].append(stat)
2.2 用户去重统计
对于每个分组,进行用户级别的去重统计:
# UV去重统计
visitors = set()
engaged_users = set()
product_viewers = set()
cart_clickers = set()
order_placers = set()
for stat in post_stats:
consumer_id = stat.get("consumerId")
if not consumer_id:
continue
if stat.get("uniqueVisitors"):
visitors.add(consumer_id)
if stat.get("engaged"):
engaged_users.add(consumer_id)
if stat.get("viewedProduct"):
product_viewers.add(consumer_id)
if stat.get("clickedAddToCart"):
cart_clickers.add(consumer_id)
if stat.get("placedOrder"):
order_placers.add(consumer_id)
2.3 设备、平台和UI分布统计
统计各类分布数据:
# 设备和平台统计
device_stats = defaultdict(int)
platform_stats = defaultdict(int)
ui_stats = defaultdict(int)
for stat in post_stats:
# 设备和平台统计(注意这里是按记录统计,不是按用户去重)
device_stats[stat.get("device", "Unknown")] += 1
platform_stats[stat.get("platform", "Unknown")] += 1
# UI交互统计
ui_data = stat.get("ui", {})
for ui_key, ui_count in ui_data.items():
ui_stats[ui_key] += ui_count
# 订单数量
order_quantity += stat.get("placedOrder", 0)
2.4 构造汇总记录
将统计结果构造成汇总记录:
# 构造汇总记录
summary_record = {
"env": self.pear_env,
"zoneId": "America/Los_Angeles",
"date": date_str,
"postId": post_id,
"fromAd": from_ad,
"uniqueVisitors": len(visitors), # 唯一访客数(去重)
"engaged": len(engaged_users), # 互动用户数(去重)
"viewedProduct": len(product_viewers), # 查看商品用户数(去重)
"clickedAddToCart": len(cart_clickers), # 加购用户数(去重)
"placedOrder": len(order_placers), # 下单用户数(去重)
"addedToCart": len(cart_clickers), # 添加到购物车用户数(去重)
"orderQuantity": order_quantity, # 订单总数(不去重)
"device": dict(device_stats), # 设备分布
"platform": dict(platform_stats), # 平台分布
"ui": dict(ui_stats) # UI交互分布
}
2.5 数据存储
最后将汇总数据存储到数据库中:
# 批量插入汇总数据
if summary_records:
# 删除已存在的同日期汇总数据
try:
self.user_activity_summary_collection.delete_many({
"env": self.pear_env,
"zoneId": "America/Los_Angeles",
"date": date_str
})
except Exception as e:
logger.error(f"删除已存在的汇总数据时发生错误: {e}")
return
try:
self.user_activity_summary_collection.insert_many(summary_records)
except Exception as e:
logger.error(f"插入汇总数据时发生错误: {e}")
return
3. 汇总特点
用户去重:对于用户行为指标(如uniqueVisitors、engaged等),使用set进行去重,确保同一用户在同一分组内只计算一次。
分布统计:对于设备、平台和UI等分布统计,按记录数量进行统计,不进行用户去重。
定时更新:汇总数据通过定时任务定期更新,保证数据的新鲜度。
覆盖写入:每次更新都会删除旧的同日期数据,然后插入新的汇总数据,确保数据一致性。
4. 总结
UserActivitySummary_America/Los_Angeles_v2 集合中的数据是通过对 UserActivityStatistic 集合中的数据按日期、广告来源和文章ID进行分组,然后对用户行为进行去重统计,对设备/平台/UI进行分布统计后生成的。这种预处理的汇总方式大大提高了 /v2/summary 接口的查询性能。