keyedStreamTable
语法
keyedStreamTable(keyColumn, X, [X1], [X2], .....)
或
keyedStreamTable(keyColumn, capacity:size, colNames, colTypes)
参数
keyColumn 是一个字符串或向量,表示主键。主键的数据类型必须属于以下类别:INTEGRAL, TEMPORAL, LITERAL 或 FLOATING。
第一种用法中: X, X1....是向量。
第二种用法中:
capacity 是正整数,表示建表时系统为该表分配的内存(以记录数为单位)。当记录数超过 capacity 时,系统会首先会分配 capacity 1.2~2 倍的新的内存空间,然后复制数据到新的内存空间,最后释放原来的内存。对于规模较大的表,此类操作的内存占用会很高。因此,建议建表时预先分配一个合理的 capacity。
size 只能是0或1。若 size=0,则建立一个空表;若 size=1,则建立一个只包含1条记录的表,记录初始值如下:
-
BOOL 类型默认值为 false;
-
数值类型、时间类型、IPADDR、COMPLEX、POINT 的默认值为 0;
-
Literal, INT128 类型的默认值为 NULL。
colNames 是字符串向量,表示列名。
colTypes 是向量,表示各列的数据类型。自 2.00.11.2 版本起,允许主键外的其它列指定为数组向量类型。
详情
创建键值流数据表。该表的主键不允许包含重复值。主键支持一个或多个字段。
实际应用中,可能由于网络原因,会出现数据重复提交写入的情况;或者在上游采用了多路高可用的方式写入数据。面对上述场景,键值流数据表可以实现流数据的幂等性写入,即多次写入键值相同的数据,其结果与第一次写入的结果相同,从而避免数据重复写入。
需要注意的是,此处的键值唯一性并非全局唯一,而是指内存中数据的唯一性。为流数据表开启持久化,可以设置内存中保留的数据条数,一旦数据条数超过设定的上限,系统将一半旧的数据持久化至磁盘。这种方案确保了内存中数据键值的唯一性,而不是全局唯一性。尽管如此,已足以解决多路写入或网络延迟导致的重复提交写入的问题。
向表中添加新记录时,系统会自动检查新记录的主键值:
-
如果新记录的主键值与内存中已有记录的主键值重复时,已有的记录不会被更新。
-
一次性批量插入新记录时,若有多条记录具有相同的主键值,且该主键值与已有记录的主键值不同,只有第一条记录能成功插入。
例子
第一种用法:
id=`A`B`C`D`E
x=1 2 3 4 5
t1=keyedStreamTable(`id, id, x)
t1;
id | x |
---|---|
A | 1 |
B | 2 |
C | 3 |
D | 4 |
E | 5 |
第二种用法:
t2=keyedStreamTable(`id,100:0,`id`x, [INT,INT])
insert into t2 values(1 2 3,10 20 30);
t2;
id | x |
---|---|
1 | 10 |
2 | 20 |
3 | 30 |
往表 t2 中插入重复主键值的数据:
insert into t2 values(3 4 5,35 45 55)
t2;
id | x |
---|---|
1 | 10 |
2 | 20 |
3 | 30 |
4 | 45 |
5 | 55 |
可以看到,id=3 的记录并没有被覆盖。
主键为多个字段:
t=keyedStreamTable(`sym`id,1:0,`sym`id`val,[SYMBOL,INT,DOUBLE])
insert into t values(`A`B`C`D`E,5 4 3 2 1,52.1 64.2 25.5 48.8 71.9);
insert into t values(`A`B`R`T`Y,5 8 3 2 1,152.3 164.6 125.5 148.8 171.6);
t;
sym | id | val |
---|---|---|
A | 5 | 52.1 |
B | 4 | 64.2 |
C | 3 | 25.5 |
D | 2 | 48.8 |
E | 1 | 71.9 |
B | 8 | 164.6 |
R | 3 | 125.5 |
T | 2 | 148.8 |
Y | 1 | 171.6 |