更新表结构
本节示例脚本中,内存表 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,再进行对应修改。所以在执行前,可以先执行 flushOLAPCache 或 flushTSDBCache 函数手动刷盘,减少等待时间。
- 本节所提的修改方法,仅有 ALTER 语句和 addColumn 可应用于流数据表。