setStreamTableTimestamp
语法
setStreamTableTimestamp(streamTable, columnName)
详情
为指定的流数据表设置一个时间戳列。 设置后,向流表写入数据时,系统可以在输入数据不包含时间戳列的情况下,自动将写入时的系统时间填充到该列。该函数可用于统计数据写入流表时的系统接收时间或写入延迟。columnName 可以是流表中任意位置的 TEMPORAL 类型列。
写入已设置时间戳列的流表时,系统按以下规则处理输入数据:
-
输入列数等于目标表物理列数时,认为输入数据已包含时间戳列,系统直接使用输入中的时间戳值。如果某一位置输入的时间为空,则依然会自动填充当前的系统时间。
-
输入列数等于目标表物理列数减 1 时,认为输入数据不包含时间戳列,系统自动将当前系统时间填充到时间戳列,并按目标表列顺序写入。
-
输入列数不属于上述两种情况时,系统报错。
-
对于流引擎的输出表,如果已经通过
setStreamTableTimestamp设置了时间戳列,则该列会被视为系统自动填充列。创建流引擎时,系统校验输出表结构时会跳过该时间戳列;引擎只需要输出除该时间戳列以外的其他列。引擎结果写入输出表时,系统会自动在该时间戳列填入当前系统时间,并按输出表的物理列顺序完成写入。
-
时间戳列必须是 TEMPORAL 类型,包括 DATE、MONTH、TIME、MINUTE、SECOND、DATETIME、TIMESTAMP、NANOTIME 或 NANOTIMESTAMP、DATAHOUR。
-
时间戳列设置后不可更改或撤销。
-
高可用流表只能在未使用状态下配置时间戳列。 应在 haStreamTable 返回后、写入数据或订阅之前调用该函数。
-
持久化恢复、HA 日志重放和 HA checkpoint 恢复不会自动重新生成时间戳;恢复数据必须包含完整的时间戳列。
-
非高可用持久化目前没有持久化
setStreamTableTimestamp的时间列配置,非高可用的持久化流表重启之后恢复,需要再次setStreamTableTimestamp才能生效。
参数
streamTable 流数据表。可以是普通流表、键值流表、共享流表、持久化流表和高可用流表。
columnName 字符串,指定流数据表中用于记录系统写入时间的列名。该列必须是 TEMPORAL 类型。
例子
例 1:设置中间列为时间戳列,并插入包含所有列的数据。
share streamTable(10000:0,`symbol`timestamp`price, [SYMBOL,TIMESTAMP,DOUBLE]) as trades
//指定 timestamp 列为时间戳列
setStreamTableTimestamp(trades, `timestamp)
// 插入包含所有列的数据
insert into trades values(`A, 2026.03.19T03:17:49, 10.2)
select * from trades
| symbol | timestamp | price |
|---|---|---|
| A | 2026.03.19 03:17:49.000 | 10.2 |
例 2:插入不包含时间戳列的数据。
insert into trades values(`B, 10.2) // 自动填充当前的系统时间
select * from trades
| symbol | timestamp | price |
|---|---|---|
| A | 2026.03.19 03:17:49.000 | 10.2 |
| B | 2026.06.27 10:49:47.812 | 10.2 |
例 3:高可用流表应在创建后立即配置时间戳列。 若高可用流表已经写入数据或存在订阅,再调用该函数会报错。
colNames = `sym`recvTime`price
colTypes = [SYMBOL, NANOTIMESTAMP, DOUBLE]
t = table(1:0, colNames, colTypes)
haTrades = haStreamTable(2, t, `haTrades, 100000)
setStreamTableTimestamp(haTrades, `recvTime)
