createTable
语法
createTable(dbHandle, table, tableName, [compressMethods], [sortColumns], [keepDuplicates=ALL])
参数
dbHandle 是 database 函数返回的分布式数据库句柄。
table 是一个表,系统将根据该表的结构在数据库中创建一个空的维度表。
tableName 是一个字符串,表示维度表的名称。
compressMethods 一个字典,指定某些列使用 lz4 或者 delta 压缩算法存储。key 为字段名,value 为压缩算法(”lz4”或”delta”)。若未指定,默认采用 lz4 压缩算法。
对于SHORT, INT, LONG 与时间或日期类型数据,建议采用 delta 算法压缩。
将字符串存储为 SYMBOL 类型数据,实现对字符串类型的压缩。
sortColumns 字符串标量或向量,用于指定表的排序列,写入的数据将按 sortColumns 进行排序。系统默认 sortColumns (指定多列时) 最后一列为时间列,其余列字段作为排序的索引列,其组合值称作 sort key。若 sortColumns 只指定一列,则该列的值将作为 sort key。系统将同一个 sort key 内的数据划分为固定大小的数据块,并在内存中维护一个指向数据块地址的索引。查询时,若查询条件包含索引列,可以快速定位数据所在的数据块位置,提高查询性能。
sortColumns 只能是 integer, temporal, string, 或 symbol 类型。
若 sortColumns 指定为多列,则 sortColumns 的最后一列必须为时间列,其余列为索引列,且索引列不能为为 TIME, TIMESTAMP, NANOTIME, NANOTIMESTAMP 类型。
若 sortColumns 仅指定一列,则该列作为 sort key,其类型不能为TIME, TIMESTAMP, NANOTIME, NANOTIMESTAMP。
频繁查询的字段适合设置为 sortColumns,且建议优先把查询频率高的字段作为 sortColumns 中位置靠前的列。
为保证性能最优,建议每个分区内索引列的组合数(sort key)不超过1000个。
sortColumns 是每个分区内部 level file 内数据的排序依据,与其是否为分区字段无关。
keepDuplicates 指定在每个分区内如何处理所有 sortColumns 之值皆相同的数据。提供以下选项:
ALL: 保留所有数据,为默认值。
LAST:仅保留最新数据
FIRST:仅保留第一条数据
注:参数 sortColumns 和 keepDuplicates 仅在 database 为 ‘TSDB’ 时才有效。
详情
在分布式数据库中创建一个维度表。维度表是分布式数据库中没有进行分区的表,适用于存储不频繁更新的小数据集。
使用 loadTable
函数将维度表加载到内存后,其占用的缓存空间不会被系统自动释放,用户可以手动调用命令 clearCachedDatabase()
进行清理。因此,不建议用户将记录数超过200万条的表存储为维度表。
维度表与分区表都是根据设置参数 dfsReplicationFactor 决定副本的数量。维度表的读写操作也支持事务。
通过在配置项配置 enableConcurrentDimensionalTableWrite = true,可以支持对维度表进行并发的写入、修改或删除操作。
例子
例1
$ db=database("dfs://db1",VALUE,1 2 3)
$ timestamp = [09:34:07,09:36:42,09:36:51,09:36:59,09:32:47,09:35:26,09:34:16,09:34:26,09:38:12]
$ sym = `C`MS`MS`MS`IBM`IBM`C`C`C
$ price= 49.6 29.46 29.52 30.02 174.97 175.23 50.76 50.32 51.29
$ qty = 2200 1900 2100 3200 6800 5400 1300 2500 8800
$ t = table(timestamp, sym, qty, price);
$ dt=db.createTable(t,`dt).append!(t);
$ select * from dt;
timestamp |
sym |
qty |
price |
---|---|---|---|
09:34:07 |
C |
2200 |
49.6 |
09:36:42 |
MS |
1900 |
29.46 |
09:36:51 |
MS |
2100 |
29.52 |
09:36:59 |
MS |
3200 |
30.02 |
09:32:47 |
IBM |
6800 |
174.97 |
09:35:26 |
IBM |
5400 |
175.23 |
09:34:16 |
C |
1300 |
50.76 |
09:34:26 |
C |
2500 |
50.32 |
09:38:12 |
C |
8800 |
51.29 |
例2
$ db = database("dfs://demodb", VALUE, 1..10)
$ t=table(take(1, 86400) as id, 2020.01.01T00:00:00 + 0..86399 as timestamp, rand(1..100, 86400) as val)
$ dt = db.createTable(t, "dt", {timestamp:"delta", val:"delta"})
$ dt.append!(t)
例3. TSDB 存储引擎下创建维度表
$ if(existsDatabase("dfs://dbctable_createTable")){
$ dropDatabase("dfs://dbctable_createTable")
$ }
$ db = database("dfs://dbctable_createTable", VALUE, 1..100, , "TSDB")
$ t1 = table(1 100 100 300 300 400 500 as id, 1..7 as v)
$ db.createTable(t1, "dt", , "id").append!(t1)
$ dt=loadTable("dfs://dbctable_createTable","dt")
相关函数: createPartitionedTable