DolphinDB CrossSectionalEngine 如何等齐设备数据后统计?
数据阿明
结论
将 triggeringPattern="perRow" 改为 triggeringPattern="keyCount",并将 triggeringInterval 设为 10。已有配置包含 keyColumn=cnc_id、timeColumn=ts 和 useSystemTime=false,因此引擎会按时间戳统计已到达的设备键。同一时间戳下的键数达到 10 时,引擎触发一次计算。建议同时设置 lastBatchOnly=true,让计算只使用最新时间戳的数据。
ccsCncRank = createCrossSectionalEngine(
name="ccsCncRank",
metrics=<[max(temp_rate), avg(temp_rate), min(temp_rate), count(temp_rate)]>,
dummyTable=cncRateStream,
outputTable=cncRankOutput,
keyColumn=`cnc_id,
triggeringPattern="keyCount",
triggeringInterval=10,
timeColumn=`ts,
useSystemTime=false,
lastBatchOnly=true
)
perRow 会在每条新记录到达时计算,所以同一时间戳下的 10 台设备会产生中间统计结果。keyCount 会在最新时间戳下的键数量达到阈值时触发。这里每台设备对应一个 cnc_id,阈值设为 10,适用于每台设备每轮上报一条记录的情况。DolphinDB createCrossSectionalEngine 文档
需要满足的条件
- 同一轮的
ts必须相同,每台设备在该时间戳下也只能贡献一个cnc_id。如果存在重复记录或键不唯一,达到 10 个键时,可能并不代表 10 台设备都已到达。 - 使用
keyCount时,ts必须按非递减顺序到达,乱序数据可能被丢弃。请确认 RSE 输出到cncRateStream的时间戳符合这一要求。 lastBatchOnly=true只能与triggeringPattern="keyCount"配合使用。它会将参与计算的数据限制为最新时间戳的记录,避免本轮统计混入尚未更新的设备旧值。
未到齐时的行为
如果更晚的时间戳到达,keyCount 也会处理较早时间戳下尚未达到阈值的数据。因此,某台设备漏报或晚到时,引擎不一定会一直等待。超时或缺失数据如何处理,需要由业务逻辑另行定义。如果业务要求必须等 10 台设备全部到齐,缺报时也不输出,应在数据进入横截面引擎前,按时间戳和设备键检查完整性或进行缓冲,达到 10 台后再送入统计。
perBatch 表示每收到一个批次就触发一次计算,并不表示要等同一时间戳的 10 台设备全部到齐。只有上游确实将每轮的 10 条记录作为一个批次发送时,才能得到每批一次的计算结果。
备注:内容仅供参考。
