更新数据

本节示例脚本中,内存表 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)

SQL 语句

UPDATE 语句可用于修改内存表或分布式表的数据,但不可用于本地磁盘表。

例如,将表 t 中 2023.10.01 的数据 val 值更新为 101,将表 pt 中 2023.10.2 的数据 val 值更新为102 :

// 更新内存表
UPDATE t SET val=101 WHERE date=2023.10.01

// 更新分布式表
UPDATE pt SET val=102 WHERE date=2023.10.02
注: 对分布式表的更新,由于多版本控制和事务机制,更新数据后,即使数据量没变,如果改动数据较多,也会出现磁盘占有率上升的情况。历史版本的数据将在 30 分钟后由系统自动回收。

upsert!

upsert! 函数可用于更新键值内存表、索引内存表和分布式表数据。

键值内存表、索引内存表均可通过类似以下方式修改:

kt = keyedTable(`id,[1,2] as id, [1.1,2.2] as price)
tmp = table([2,3] as id,[6.6,3.3] as price)
upsert!(kt,tmp)

对于分布式表,需要设置参数 keyColNames 为分区列:

new_data = table(2023.10.03 as date, 'C' as sym, 103 as val)
upsert!(pt,new_data,,`date)
注: upsert! 在更新分布式表时,如果参数 keyColNames 指定的列存在重复值,仅会更新第一个值所在行,其余行不会更新。

update!

update! 函数可用于更新内存表数据,通过指示表中已有列,更新该列的数据:

update!(t,"sym",'E')

赋值

对内存表的已有列进行整列赋值,修改此列的数据。此方法等同于使用 update!

t[`val] = 101..200