You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark不通过Join从另一表随机选取K个同时段可用会议的方法

随机获取入会时刻其他进行中会议的实现方案

需求背景

现有两张业务表:

  • 会议表:存储每场会议的唯一标识、开始时间、结束时间
  • 参会表:每行对应一条真实的用户参会记录,包含用户标识、所参加会议标识、用户入会时间

需要为每条参会记录生成新字段,返回K个用户入会时刻(分钟级粒度)正在进行的其他随机会议,需排除用户实际参加的那场会议。


示例数据

会议表数据

MeetingStart timeEnd time
M1Nov 01, 2021 8:00 AMNov 01, 2021 9:00 AM
M2Nov 01, 2021 8:00 AMNov 01, 2021 8:45 AM
M3Nov 01, 2021 8:15 AMNov 01, 2021 8:45 AM
M4Nov 01, 2021 8:15 AMNov 01, 2021 9:00 AM
M5Nov 01, 2021 9:00 AMNov 01, 2021 10:00 AM
M6Nov 01, 2021 9:00 AMNov 01, 2021 9:45 AM
M7Nov 01, 2021 9:15 AMNov 01, 2021 9:45 AM
M8Nov 01, 2021 9:15 AMNov 01, 2021 10:00 AM

参会表数据

UserMeetingJoined time
U1M1Nov 01, 2021 8:01 AM
U2M3Nov 01, 2021 8:16 AM
U3M7Nov 01, 2021 9:16 AM

期望输出(K=2时)

UserMeetingJoined timeK other meetings possible
U1M1Nov 01, 2021 8:01 AM[M2]
U2M3Nov 01, 2021 8:16 AM[M4, M2]
U3M7Nov 01, 2021 9:16 AM[M8, M5]

现有方案痛点

现有思路是先构造分钟级的会议可用表,按时间字段和参会表关联后使用UDF随机选取K个会议,但数据量大时容易出现内存溢出问题。

问题

假设分钟级可用表已经存在,有没有无需进行关联和过滤操作的其他实现方案?


解决方案

可采用预聚合字典映射+本地查询的方案,完全不需要表关联操作:

  1. 预构建时间-会议映射字典
    将已有的分钟级可用表预聚合为键值结构:
  • 键:分钟级时间标识,比如把Nov 01, 2021 8:01 AM转换为对应的分钟级Unix时间戳,或者格式化字符串202111010801
  • 值:该分钟所有正在进行的会议ID列表

把这个字典全量加载到执行节点的本地内存中即可,因为是分钟级粒度,就算覆盖一整年的时间,也只有365*24*60=525600个键,每个键对应会议列表就算平均10个,总数据量也不到10MB,完全不会有内存压力。

  1. 参会记录本地查询生成结果
    遍历每条参会记录:
  • 把当前记录的入会时间转换为对应分钟级的键
  • 从本地字典中取出该分钟对应的会议列表
  • 过滤掉当前用户参加的会议ID
  • 从剩下的列表中随机取K个(如果不足K个就返回全部),格式化为列表字段即可

这个方案全程只有一次字典加载的开销,后续参会记录处理都是O(1)的本地查询,完全不需要跨表关联,也不会有内存溢出问题,性能远高于关联方案。


内容的提问来源于stack exchange,提问作者Hossein Mousavi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:45:01