流数据异常检测引擎输出的时间不对

floraj
  • 557

在传感器监控系统中,我用DolphinDB流数据异常检测引擎实现2分钟内若温度传感器出现2次40度以上,一次30度以上就报警的功能时,碰到报警输出时间不对的问题,代码如下:

login("admin","123456")

st=streamTable(1000000:0,`deviceID`ts`temperature`speed,[INT,DATETIME,FLOAT,INT])
enableTableShareAndPersistence(st,`sensor,false, true, 1000000)


//创建报警表
share streamTable(1000:0, `time`deviceID`anomalyType`anomalyString, [TIMESTAMP,INT,INT, SYMBOL]) as warningTable

//创建异常检测引擎,2分钟内,温度传感器出现2次40度以上,一次30度以上,报警
engine = createAnomalyDetectionEngine(name="engine1", metrics=<[sum(temperature > 40) > 2 && sum(temperature > 30) > 0  ]>,dummyTable=sensor, outputTable=warningTable, timeColumn=`ts,keyColumn=`deviceID ,windowSize= 120,step=30)
subscribeTable(tableName="sensor", actionName="sensorAnomalyDetection", offset=0,handler= append!{engine}, msgAsTable=true)


//模拟写入流表
def writeData(){
    deviceNum = 3
    for (i in 0:600) {
        data = table(take(1..deviceNum,deviceNum) as deviceID ,take(now().datetime(),deviceNum) as ts,rand(10..41,deviceNum) as temperature,rand(2000..3000,deviceNum) as speed)
        sensor.append!(data)
        sleep(1000)
    }

}
submitJob("simulateData", "simulate sensor data", writeData)

执行后,查询报警表warningTable,结果如下:
image

这个时间1970.01.19不对,应该是当前时间。

回复
阅读 647
1 个回答

warningTable流表time列的数据类型不对,应为DATETIME。

按照DolphinDB用户手册中对创建异常检测引擎函数createAnomalyDetectionEngine各参数的说明,异常引擎对输出表的格式有严格要求,即它的第一列必须是时间类型,用于存放检测到异常的时间戳,并且该列的数据类型需与输入表的时间列一致。如果keyColumn(分组列)参数不为空,那么第二列为keyColumn,在本例中,分组列为传感器编号deviceID。之后的两列分别为int类型和string/symbol类型,用于记录异常的类型(在metrics中的下标)和异常的内容。建表代码如下:

share streamTable(1000:0, `time`deviceID`anomalyType`anomalyString, [DATETIME,INT,INT, SYMBOL]) as warningTable
你知道吗?

宣传栏