replaceColumn!
语法
replaceColumn!(table, colName, newCol)
详情
- 当 table 为内存表时(包括支持的共享内存表,详见 table 参数说明):
-
使用向量替换table 中指定列。替换后,指定列的数据类型与向量的数据类型一致。支持替换多列(请注意该操作目前不保证原子性,即在遇到一些系统错误时可能出现部分列替换失败的情况)。
-
-
replaceColumn!与 SQL 中的 update 语句的区别在于,前者可以修改列的值或数据类型,而后者只能修改列的值。
-
-
- 当 table 为 OLAP 分布式表时,
replaceColumn!仅修改列的数据类型,并遵循以下规则:- SYMBOL 类型不支持转换,即不能将 SYMBOL 转换为其他类型,其他类型也不能转换为 SYMBOL。
- 除 SYMBOL 外,同类别的数据类型间支持相互转换。
- INTEGRAL 和 FLOATING 类型支持相互转换。
- INTEGRAL, FLOATING, LITERAL, TEMPORAL 类型支持转换为 STRING 类型。
参数
- 普通内存表(非共享)
- 键值表(含共享):keyedTable 和 latestKeyedTable
- 索引表(含共享):indexedTable 和 latestIndexedTable
- MVCC 表(含共享)
- OLAP 引擎的分布式表
colName 字符串,表示要替换列的列名。当 table 是内存表时,colName 也可以是字符串向量,表示多列的列名。注意:当 table 是键值内存表、索引内存表(包括共享表)时,colName 不能指定为主键列。
newCol 表示用于替换的列值。当 table 是内存表(包括共享表)时,当 colName 为标量时,newCol 是一个长度与 table 行数相同的向量;当 colName 为向量时,newCol 是一个元组,其元素个数与 colName 一致,且每一个元素是一个长度与 table 行数相同的向量。当 table 是 OLAP 分布式表时,newCol 仅用于提供目标数据类型。
返回值
返回替换后的表。
例子
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
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]
t = table(timestamp, sym, qty, price)
schema(t).colDefs;
输出返回:
| name | typeString | typeInt | extra | comment |
|---|---|---|---|---|
| timestamp | SECOND | 10 | ||
| sym | STRING | 18 | ||
| qty | INT | 4 | ||
| price | DOUBLE | 16 |
把 sym 列的数据类型修改为 SYMBOL 类型:
syms=symbol(exec sym from t)
replaceColumn!(t,`sym,syms);
schema(t).colDefs;
输出返回:
| name | typeString | typeInt | extra | comment |
|---|---|---|---|---|
| timestamp | SECOND | 10 | ||
| sym | SYMBOL | 17 | ||
| qty | INT | 4 | ||
| price | DOUBLE | 16 |
newPrice =round(t.qty)
newTimestamp = minute(t.timestamp)
replaceColumn!(t, `price`timestamp, (newPrice,newTimestamp))
schema(t).colDefs;输出返回:| name | typeString | typeInt | extra | comment |
|---|---|---|---|---|
| timestamp | MINUTE | 9 | ||
| sym | SYMBOL | 17 | ||
| qty | INT | 4 | ||
| price | INT | 4 |
login("admin","123456")
if(existsDatabase("dfs://replaceColumn")){
dropDatabase("dfs://replaceColumn")
}
n=10
month=take(2012.06.13..2012.06.13, n);
x=rand(1.0, n);
t=table(month, x);
db=database("dfs://replaceColumn", VALUE, 2012.06.13..2012.06.23)
pt = db.createPartitionedTable(t, `pt, `month);
pt.append!(t);
schema(pt).colDefs
输出返回:
| name | typeString | typeInt | extra | comment |
|---|---|---|---|---|
| month | DATE | 6 | ||
| x | DOUBLE | 16 |
newCols=array(INT,0)
replaceColumn!(loadTable("dfs://replaceColumn",`pt), `x, newCols)
schema(pt).colDefs
输出返回:
| name | typeString | typeInt | extra | comment |
|---|---|---|---|---|
| month | DATE | 6 | ||
| x | INT | 4 |
替换共享键值表中的非主键列
t = keyedTable(`sym`id, 1:0, `sym`id`val, [SYMBOL, INT, INT])
insert into t values(`A`B`C`D`E, 5 4 3 2 1, 52 64 25 48 71)
share t as shareT
vals = 11..15
replaceColumn!(shareT, `val, vals)
| sym | id | val |
|---|---|---|
| A | 5 | 11 |
| B | 4 | 12 |
| C | 3 | 13 |
| D | 2 | 14 |
| E | 1 | 15 |
