share

语法

share(table, sharedName, [database], [dbName], [partitionColumn], [readonly=false])

参数

New in version 2.00.10: table 参数新增支持引擎

table 是要在会话中共享的表或引擎。

sharedName 是在会话中共享表的名称,或共享的分布式表的名称。

database 是数据库句柄。当该参数是用 database 函数定义时,它需要指定每个分区的名称。

dbName 是分布式数据库的名称。

partitionColumn 是分布式表的分区列。

readonly 是一个布尔值,表示是否将普通/键值/索引内存表共享为一个只读的内存表,以提升读取和查询时的性能。默认值为false。

详情

如果只有 tablesharedName 两个参数:

  • table 是表时,以指定名称在会话中共享表。包括表在内的本地对象在其他会话中不可见的。只有通过共享,它们才能在其他会话中可见。共享表的名称必须与会话中的普通表的名称不同。一般来说,共享的流数据表不支持删除和更新记录,但是 tablemvccTable 函数创建的表共享后支持删除和更新记录。所有的共享表都支持插入记录。

  • 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
10,000