问题
- 时序数据库 IoTDB 如果在数据插入时未指定属性值的类型,而后期需要将原本推断为 INT32 类型的数据强制转换为 TEXT 类型,应如何处理?
- 如果字段类型不支持直接修改,是否有其他方案可以实现字段类型的调整?
- 如何将设备某个属性的类型从 TEXT 更改为 LONG?
- 如何修改已存在数据序列的字段类型,例如将原本为 FLOAT 类型的字段修改为 INT 类型?
- 是否可以更改 timeseries 的数据类型,例如将 FLOAT 类型更改为 DOUBLE?
原因
IoTDB 不支持修改已经创建测点的类型。
方案
(1)如果不需要旧数据:
方案一:删除旧序列重新创建新元数据
删除旧序列,并在创建新元数据时手动指定目标数据类型,然后重新写入数据。
方案二:修改自动推断策略配置
删除旧序列,修改自动推断策略配置并重启服务,以实现自动创建新的目标类型元数据。
自动创建模式配置:
####################
### Configurations for creating schema automatically
##################### Whether creating schema automatically is enabled
# If true, then create database and timeseries automatically when not exists in insertion
# Or else, user need to create database and timeseries before insertion.
# effectiveMode: hot_reload
# Datatype: boolean
enable_auto_create_schema=true# ALL data types: BOOLEAN, INT32, INT64, FLOAT, DOUBLE, TEXT# register time series as which type when receiving boolean string "true" or "false"
# effectiveMode: hot_reload
# Datatype: TSDataType
# Options: BOOLEAN, TEXT
boolean_string_infer_type=BOOLEAN# register time series as which type when receiving an integer string and using float or double may lose precision
# effectiveMode: hot_reload
# Datatype: TSDataType
# Options: DOUBLE, FLOAT, INT32, INT64, TEXT
integer_string_infer_type=DOUBLE# register time series as which type when receiving a floating number string "6.7"
# effectiveMode: hot_reload
# Datatype: TSDataType
# Options: DOUBLE, FLOAT, TEXT
floating_string_infer_type=DOUBLE# register time series as which type when receiving the Literal NaN.
# effectiveMode: hot_reload
# Datatype: TSDataType
# Options: DOUBLE, FLOAT, TEXT
nan_string_infer_type=DOUBLE
(2)如果需要旧数据:
- 使用 Select into + Cast:具体支持的转换规则详见官方文档:内置函数与表达式章节。
# 举例:将DOUBLE类型转成TEXT类型
select cast(L1_BidPrice as TEXT) into root.stock.Legacy.0700HK(L1_BidPrice_back) from root.stock.Legacy.0700HK
- 导入导出工具:将数据导出 CSV 文件,修改类型后再重新导入目标类型一致的序列。
- 自定义程序:
- TsFile 重写:调用 TsFile 写入 API 重写 TsFile。
- Session 数据重写:查询旧数据,修改为指定类型后再批量写入到新测点。