createTable

语法

createTable(dbHandle, table, tableName, [compressMethods], [sortColumns], [keepDuplicates=ALL])

参数

dbHandledatabase 函数返回的分布式数据库句柄。

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:仅保留第一条数据

注:参数 sortColumnskeepDuplicates 仅在 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