latestKeyedStreamTable
语法
latestKeyedStreamTable(keyColumns, timeColumn, [X1], [X2],
.....)
或
latestKeyedStreamTable(keyColumns, timeColumn, capacity:size, colNames,
colTypes)
参数
在 keyedStreamTable 的基础上,增加了 timeColumn 参数。
timeColumn 字符串标量或长度为 2 的向量,分别用于指定 1 个或 2 个时间列。当仅指定 1 个时间列时,该列可以为整型或时间类型;当指定 2 个时间列时,第 1 列必须是 DATE 类型,第 2 列则是 TIME, SECOND 或 NANOTIME 类型。通过这两列,可以共同确定唯一的时间值。
详情
创建一个键值流数据表,该表包含一个主键,且该主键不允许重复值。主键可由一个或多个字段组成。其相较于 keyedStreamTable,除主键外,还包含一个时间列,用于判断是否添加记录。
向表中添加新记录时,系统会自动检查新记录的主键值:
-
如果新记录的主键值与内存中已有记录的主键值相同,且新记录的时间戳大于已有记录的时间戳,则将新记录添加至表中,否则直接舍弃。
-
一次性批量插入新记录时,若有多条记录具有相同的主键值,且该主键值与已有记录的主键值不同,只有时间戳最大的记录可以插入成功。
例子
例1. 主键为 1 个字段
第一种写法:
id = `A`B`C`D`E
x = 1 2 3 4 5
timeCol = 2024.09.10T00:00:00.001+0..4
t1 = latestKeyedStreamTable(`id, `timeCol, id, x, timeCol)
t1;
id |
x |
timeCol |
---|---|---|
A | 1 | 2024.09.10T00:00:00.001 |
B | 2 | 2024.09.10T00:00:00.002 |
C | 3 | 2024.09.10T00:00:00.003 |
D | 4 | 2024.09.10T00:00:00.004 |
E | 5 | 2024.09.10T00:00:00.005 |
第二种写法:
t2=latestKeyedStreamTable(`id, `timeCol, 100:0, `id`x`timeCol, [INT,INT,TIMESTAMP])
insert into t2 values(1 2 3, 10 20 30, [2024.09.10T00:00:00.001,
2024.09.10T00:00:00.002, 2024.09.10T00:00:00.003])
t2
id |
x |
timeCol |
---|---|---|
1 | 10 | 2024.09.10T00:00:00.001 |
2 | 20 | 2024.09.10T00:00:00.002 |
3 | 30 | 2024.09.10T00:00:00.003 |
向表 t1 中插入新记录,并且新记录中的主键值与表中主键值相同时,将根据 timeColumn 来确定是否插入新记录:
insert into t1 values(`D`E`F, 6 7 8, [2024.09.10T00:00:00.005,
2024.09.10T00:00:00.005, 2024.09.10T00:00:00.005])
t1
id |
x |
timeCol |
---|---|---|
A | 1 | 2024.09.10T00:00:00.001 |
B | 2 | 2024.09.10T00:00:00.002 |
C | 3 | 2024.09.10T00:00:00.003 |
D | 4 | 2024.09.10T00:00:00.004 |
E | 5 | 2024.09.10T00:00:00.005 |
D | 6 | 2024.09.10T00:00:00.005 |
F | 8 | 2024.09.10T00:00:00.005 |
可以看到,新插入了 id=`D 和 id=`F 的记录,而 id=`E 的记录被丢弃了。新增的 id 为 D 的记录因为时间戳大于已存在的 id 为 D 的记录,所以插入成功;id 为 E 的记录因为时间戳等于已有的 id 为 E 的记录,所以被舍弃;因为已有记录中没有 id 为 F 的记录,所以它被成功插入。
例2. 主键为多个字段
t3 = latestKeyedStreamTable(`id`x, `timeCol, id, x, timeCol)
insert into t3 values(`D`E, 4 5, [2024.09.10T00:00:00.004, 2024.09.10T00:00:00.005])
insert into t3 values(`D`F, 6 7, [2024.09.10T00:00:00.004, 2024.09.10T00:00:00.005])
t3
id |
x |
timeCol |
---|---|---|
A | 1 | 2024.09.10T00:00:00.001 |
B | 2 | 2024.09.10T00:00:00.002 |
C | 3 | 2024.09.10T00:00:00.003 |
D | 4 | 2024.09.10T00:00:00.004 |
E | 5 | 2024.09.10T00:00:00.005 |
D | 6 | 2024.09.10T00:00:00.004 |
F | 7 | 2024.09.10T00:00:00.005 |
例3. 时间列指定为两列
id = `A`B`C`D`E
dateCol = take(2024.09.10, 5)
timeCol = 00:00:00.001+0..4
t4 = latestKeyedStreamTable(`id, `dateCol`timeCol, id, x, dateCol, timeCol)
t4
id |
x |
dateCol |
timeCol |
---|---|---|---|
A | 1 | 2024.09.10 | 00:00:00.001 |
B | 2 | 2024.09.10 | 00:00:00.002 |
C | 3 | 2024.09.10 | 00:00:00.003 |
D | 4 | 2024.09.10 | 00:00:00.004 |
E | 5 | 2024.09.10 | 00:00:00.005 |
向表 t4 中插入新记录,并且新记录中的主键值与表中主键值相同时,将根据concatDateTime(dateCol, timeCol)
的值来确定是否插入新记录:
insert into t4 values(`D`E, 4 5, [2024.09.10, 2024.09.11], [00:00:00.004, 00:00:00.005]);
t4
id |
x |
dateCol |
timeCol |
---|---|---|---|
A | 1 | 2024.09.10 | 00:00:00.001 |
B | 2 | 2024.09.10 | 00:00:00.002 |
C | 3 | 2024.09.10 | 00:00:00.003 |
D | 4 | 2024.09.10 | 00:00:00.004 |
E | 5 | 2024.09.10 | 00:00:00.005 |
E | 5 | 2024.09.11 | 00:00:00.005 |