share
语法
share(table, sharedName, [database], [dbName],
[partitionColumn], [readonly=false])
参数
table 是要在会话中共享的表或引擎。
sharedName 是在会话中共享表的名称,或共享的分布式表的名称。
database 是数据库句柄。当该参数是用 database 函数定义时,它需要指定每个分区的名称。
dbName 是分布式数据库的名称。
partitionColumn 是分布式表的分区列。
readonly 是一个布尔值,表示是否将普通/键值/索引内存表共享为一个只读的内存表,以提升读取和查询时的性能。默认值为 false。
详情
如果只有 table 和 sharedName 两个参数:
-
table 是表时,以指定名称在会话中共享表。包括表在内的本地对象在其他会话中不可见的。只有通过共享,它们才能在其他会话中可见。共享表的名称必须与会话中的普通表的名称不同。一般来说,共享的流数据表不支持删除和更新记录,但是 table 和 mvccTable 函数创建的表共享后支持删除和更新记录。所有的共享表都支持插入记录。
-
table 是引擎时,会对引擎增加写入锁,以实现对引擎的并发写入。
如果使用了5个参数,填充分布式表的碎片,然后以指定名称在会话中共享。分区碎片是以给定列为基础。我们可以使用多个 share 语句在多个节点之间保存分区表。
请注意,不可以将同一个流数据表通过修改共享变量名称的方式共享2次及以上。
例子
share(t, `sharedT);
share(t, `quotes, tickDB, `tickDB, `date);
trades = streamTable(1:0, `time`sym`price, [TIMESTAMP, SYMBOL, DOUBLE])
share table(100:0, `sym`time`factor1, [SYMBOL, TIMESTAMP, DOUBLE]) as outputTable
engine = createReactiveStateEngine(name="test", metrics=[<time>, <mavg(price, 3)>], dummyTable=trades, outputTable=outputTable, keyColumn=`sym)
# 将引擎 engine 共享
share(engine, "test")
# 第一个自定义函数,向 engine 写入数据
def write1(mutable engine) {
N = 10
for (i in 1..500) {
data = table(take(now(), N) as time, take(`A`B, N) as sym, rand(10.0, N) as price)
engine.append!(data)
}
}
# 第二个自定义函数,向 engine 写入数据
def write2(mutable engine) {
N = 10
for (i in 1..500) {
data = table(take(now(), N) as time, take(`C`D, N) as sym, rand(10.0, N) as price)
engine.append!(data)
}
}
# 提交作业,使 write1 和 write2 同时向引擎写入数据
submitJob("j1", "j1", write1, engine)
submitJob("j2", "j2", write2, engine)
# 查看输出表中数据行数为 10000,正好是 write1 和 write2 写入的数据量之和。
select count(*) from outputTable
# output
10,000