3.00.3
缺陷修复带来的系统影响
-
修改函数
elasticNetCV
,lassoCV
,ridgeCV
参数校验:- 旧版本中,参数 yColName, xColNames 可以指定时间类型的列。
- 新版本起,参数 yColName, xColNames 仅支持数值类型列,否则会报错。
-
修改
iif
函数和三元运算符?:
返回值类型:- 旧版本中,优先根据 trueResult 和 falseResult 数据形式确定返回值的形式。
- 新版本起,返回值与 cond 的数据形式一致。
iif([true,false],1:2,(3..4$1:2)) true false?(1:2):(3..4$1:2) // 旧版本返回 INT PAIR 1:4 // 新版本返回 FAST INT VECTOR [1,4]
-
修改函数
seq
对 NULL 值的处理行为。当 start 或 end 任一为 NULL 时:- 旧版本会返回不符合预期的结果。
- 新版本会直接报错。
-
若建表时为 LONG 或 NANOTIMESTAMP 类型的列指定 delta of delta 压缩算法(即
compressMethods="delta"
),当 delta-of-delta 值溢出时:- 旧版本中,数据刷盘失败且持续重试,导致系统阻塞。
- 新版本起,溢出数据会转换为空值。
dbName = "dfs://test" if(existsDatabase(dbName)) { dropDatabase(dbName) } db = database(dbName,HASH, [INT, 1]) t = table(10:0,[`id, `data],[INT, LONG]) pt = db.createPartitionedTable(t, `pt, `id, {data:"delta"}) t = table(1..5 as id, [1,1,8704332179800340403, 105, 27162335252578330] as data) pt.append!(t) purgeCacheEngine() sleep(1000) select * from pt
新版本查询结果:
id data 1 1 2 1 3 8,704,332,179,800,340,403 4 5 -
当 SQL CASE 语句的 THEN 和 ELSE 子句中使用
string
函数且返回标量时,旧版本返回 STRING 类型,新版本改为 SYMBOL 类型。t = table(0 NULL 1 as id) re = select case when id=0 then string("a") else string("b") end from t select name,typeString from schema(re).colDefs // 旧版本 col1 列为 STRING 类型 // 新版本 col1 列为 SYMBOL 类型
-
修改
varma
函数输入数据源时的排序逻辑:- 旧版本中,模型会根据数据源第一列对数据自动排序。
- 新版本起,仅当第一列是时间列时,模型才会对数据排序。
-
修改非管理员用户执行
getClusterDFSDatabases
时的可见范围:- 旧版本中,返回用户拥有 DB_MANAGE 权限或自己创建的分布式数据库。
- 新版本起,新增返回用户拥有DB_READ/DB_INSERT/DB_UPDATE/DB_DELETE/DBOBJ_CREATE/DBOBJ_DELETE 权限的分布式数据库。
- 在 SQL EXEC 语句中若使用了 DISTINCT
和聚合函数,并且查询涉及表连接,旧版本的查询结果为一个标量,新版本中则返回一个向量。
sym = `C`MS`MS`MS`IBM`IBM`C`C`C$SYMBOL 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 t1 = table(sym, qty); t2 = table(sym, price); x = exec distinct count(price) from t1 full outer join t2 on t1.sym=t2.sym; typestr x; //老版本返回 INT //新版本返回 FAST INT VECTOR
- 在创建流数据日级时间序列引擎 (
createDailyTimeSeriesEngine
) 时:- 若配置了 session 时段,则 roundTime 不再生效,mergeLastWindow 不再规整 session 时段。
- 采用如下方式指定跨天 session
时段时:
keyPurgeDaily 的行为发生变化:sessionBegin = [00:00:00, 09:00:00, 13:00:00, 21:00:00] sessionEnd = [01:00:00, 11:30:00, 15:00:00, 00:00:00] //即 session 时段为21:00:00-次日01:00:00,09:00:00-11:30:00, 13:00:00-15:00:00。
- 在之前版本中,keyPurgeDaily 在 21:00:00 之前不生效,15:00:00-21:00:00 之间的数据会并入 21:00:00的窗口。
- 在新版本中,keyPurgeDaily 在 21:00:00 之前生效,15:00:00-21:00:00 之间的数据会被丢弃。
- 当用户的权限发生变化:
- 在旧版本中,该用户可以在当前会话中通过切换为其他用户后再次登录(
login
)的方式来生效新权限。 - 在新版本中,权限变更后必须显式执行登出(`logout`)操作,并重新登录,才能获取最新的权限设置。
- 在旧版本中,该用户可以在当前会话中通过切换为其他用户后再次登录(
- 函数
getUserAccess
的返回结果中,原 “COMPUTE_GROUP_allowed” 字段名自新版本起改为 “COMPUTE_GROUP_EXEC_allowed”。 - 在新版本中,设置了对 SQL 查询 WHERE 子句的限制:WHERE 子句中的条件数量(以逗号分隔)最多为 1024 个;每个条件表达式中最多允许 1024 个运算符(包括 AND)。若超过限制,系统将报错。
- 自新版本起,将不再支持快照引擎(由
registerSnapshotEngine
创建)。用户可使用IOTDB 引擎(通过 CREATE 语句等方式指定)实现相同的功能,获取每个分组的最新记录。 - 旧版本中,单次事务写入的数据量无限制。新版本起,为提升系统稳定性,引入了单次事务写入大小限制,默认限制为存储引擎 Cache Engine 容量上限的
20%。当写入数据量超过限制时,将会报错,例如:
如需保持旧版本行为,可通过以下方式取消或放宽该限制:Memory size of append transaction 2000000216 exceeds max limit (429496729) for OLAP. Please split data into batches.
- 设置配置参数 maxTransactionRatio=1,即将事务大小限制调整为 Cache Engine 上限的 100%;
- 或在运行时调用
setMaxTransactionSize
动态修改限制值。
- 在旧版本中:在内存表中,对于元素类型相同的元组(ANY)所创建的列,系统会自动将其转换为列式元组类型(ColumnarTuple)。转换后,该列不再允许插入其他类型的数据,若尝试插入将报错。
从新版本起:系统不再自动执行上述转换,而是保持为普通的ANY类型列,因此允许插入不同类型的数据。
为保持对旧版本行为的兼容性,引入配置项 autoConversionToColumnarTuple,默认值为 false,表示默认采用新版本行为(不自动转换为列式元组)。如需兼容老版本行为,可将该配置项设置为 true。id = 1 2 3 val = [[1,2,3,4], [4,5,6],[7,8,9]] t = table(id, val) isColumnarTuple(t[`val]) //老版本返回 true //新版本返回 false insert into t values(1, "a") // 老版本报错:Failed to append data to column 'val'. insert into t values(1, "a") //新版本可以插入
- 增强了异常检测引擎的参数校验。当调用
createAnomalyDetectionEngine
函数时,如果传入非法的 metrics 参数:- 在旧版本中,函数执行不会立即报错,而是在数据写入后,通过
getStreamEngineStat
函数返回错误信息。 - 在新版本中,系统会在创建引擎时直接抛出异常。
- 在旧版本中,函数执行不会立即报错,而是在数据写入后,通过
- 在 SQL 分布式查询中,如果 SELECT 语句中引用了
tableName.colName
,且 FROM 子句包含了带 JOIN 的子查询,新版本中必须为该子查询显式指定 AS 表名,否则会报错SQL context is not initialized yet
。
在多表连接后执行 SELECT * 语句可能会导致较高的内存消耗。建议在 SELECT 子句中明确指定实际所需的列,以避免不必要的资源占用和潜在的性能问题。dbName = "dfs://test" if(existsDatabase(dbName)){ dropDatabase(dbName) } db = database(dbName, VALUE, 1..100) n = 100 t = table(take(0..30, n) as id, rand(10 ,n) col1, rand(10 ,n) col2) pt1 = db.createPartitionedTable(t, `pt1, `id).append!(t) pt2 = db.createPartitionedTable(t, `pt2, `id).append!(t) // 旧版本中无需指定别名 select pt1.id in 1..5 from (select * from pt1 full join pt2 on pt1.col1=pt2.col1) // 新版本必须显式指定别名 select pt1.id in 1..5 from (select * from pt1 full join pt2 on pt1.col1=pt2.col1) as pt1
修改 CEP monitor 相关接口:
- 新版本起,定义 monitor 类时必须显式继承
CEPMonitor
。// 旧版本 class mainMonitor{ ... } // 新版本 class mainMonitor:CEPMonitor{ ... }
修改 CEP monitor 相关接口:
- 在 CEP monitor 中使用
getDataViewEngine
获取 DataView 引擎数据时,旧版本要求将 CEPEngine 参数置空。新版本起,支持直接传入 DataView 引擎名称。// 旧版本 getDataViewEngine(,'traderDV') // 新版本 getDataViewEngine('traderDV')
- 旧版本中,在 CEP monitor 内部调用
dropStreamEngine
可以删除外部流引擎。新版本起,该方法仅可删除当前 CEP 引擎内创建的流引擎。 spawnMonitor
接口新增 name 参数:
name 为新生成 monitor 的唯一标识。若与现有 monitor 重名,// 旧版本 spawnMonitor(handler, args...) // 新版本 spawnMonitor(name, handler, args...)
spawnMonitor
将失败并报错。