更新表结构

本节示例脚本中,内存表 t 和 分布式表 pt 及其数据由以下脚本生成:

t = table(2023.10.01 + take(0..9,100) as date, take(['A','B','C','D'],100) as sym, 1..100 as val)

db = database("dfs://olapdemo",VALUE,2023.10.01..2023.10.10)
pt = db.createPartitionedTable(t,`pt,`date)
pt.append!(t)

修改列顺序

通过 reorderColumns 函数可以将内存表的列重新排序,此方法只能用于非分区、非共享的内存表。

reorderColumns!(t,`date`val`sym)

如果指定新的列顺序时,只指定了部分列,则这些列将按照指定顺序作为表的前几列,其余列按照原有先后顺序依次排列在后。

reorderColumns!(t,`date`val)

修改列名

通过 rename! 函数修改列名,可用于内存表和使用 OLAP 存储引擎的分布式表:

rename!(t,`sym,`sym_new)

修改列类型

通过 replaceColumn! 函数替换整个列,从而实现修改列的数据类型,此方法适用于内存表和使用 OLAP 存储引擎的分布式表:

replaceColumn!(t,"val",double(t.val))

如果分布式表的数据量很大,整列替换会对内存带来很大压力,甚至超出内存容量,此时可以采用以下方法:

newType = array(DOUBLE,0,1) 
replaceColumn!(pt,"val",newType)

增加列

通过 ALTER 语句为内存表或分布式表增加列:

ALTER TABLE t ADD COLUMN new INT 

ALTER TABLE pt ADD COLUMN new INT 

通过 addColumn 函数为内存表或分布式表增加列:

addColumn(t,`new_2,DOUBLE)

addColumn(pt,`new_2,DOUBLE)

通过 update! 函数为内存表增加列,指定一个新的列名:

update!(t,"new_3",1..100)

通过赋值方法为内存表增加列(此方法不适用于分布式表):

t[`new_4] = string(NULL)
注:
  • 增加列后,在插入新结构数据之前,仍然可以插入原来结构的数据。
  • 一旦插入了新结构的数据,就不能插入原来结构的数据。

删除列

通过 dropColumns! 函数删除内存表或使用 OLAP 存储引擎的分布式表的列 val:

dropColumns!(t,`val)
dropColumns!(pt,`val)

修改表名

对于分布式表,修改表名可以通过 renameTable 函数实现,修改后请执行 loadTable 重新加载表的元数据对象:

renameTable(db,"pt","pt_new") 
pt = loadTable(db,"pt_new")
注:
  • 使用函数 rename!dropColumns!replaceColumn! 修改表名时,可能会遇到执行缓慢甚至超时报错的情况。这是由于在执行上述几个操作时,需要先将 cache engine 刷盘,并回收 redo log,再进行对应修改。所以在执行前,可以先执行 flushOLAPCacheflushTSDBCache 函数手动刷盘,减少等待时间。
  • 本节所提的修改方法,仅有 ALTER 语句和 addColumn 可应用于流数据表。