PAYATHON 2026

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 条记录作为一个批次发送时,才能得到每批一次的计算结果。

备注:内容仅供参考。