更新数据
本节示例脚本中,内存表 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