UserActivitySummary_America/Los_Angeles_v2 数据源及汇总逻辑详解

1. 数据源说明

UserActivitySummary_America/Los_Angeles_v2 集合中的数据来源于定时任务调度程序(schedule)的处理结果。具体来说,数据源是经过层层处理后的 UserActivityStatistic 数据。

处理流程如下:

  1. 原始用户行为数据(UserActivity)→
  2. 会话处理后的数据(ProcessedUserActivity)→
  3. 统计数据(UserActivityStatistic)→
  4. 汇总数据(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. 汇总特点

  1. 用户去重:对于用户行为指标(如uniqueVisitors、engaged等),使用set进行去重,确保同一用户在同一分组内只计算一次。

  2. 分布统计:对于设备、平台和UI等分布统计,按记录数量进行统计,不进行用户去重。

  3. 定时更新:汇总数据通过定时任务定期更新,保证数据的新鲜度。

  4. 覆盖写入:每次更新都会删除旧的同日期数据,然后插入新的汇总数据,确保数据一致性。

4. 总结

UserActivitySummary_America/Los_Angeles_v2 集合中的数据是通过对 UserActivityStatistic 集合中的数据按日期、广告来源和文章ID进行分组,然后对用户行为进行去重统计,对设备/平台/UI进行分布统计后生成的。这种预处理的汇总方式大大提高了 /v2/summary 接口的查询性能。

results matching ""

    No results matching ""