如何重命名GridDb TimeSeries列且保留原有数据?
GridDB TimeSeries列重命名(保留数据)
问题背景
现有TimeSeries容器Wind,列结构为[Date, speed, diretction],包含如下数据:
Wind[date='Thu Aug 29 23:37:15 CEST 2024', speed=25, diretction=80]
需要将拼写错误的列diretction重命名为direction,同时保留该列的所有数据。之前尝试直接替换列名的方法会导致数据丢失,效果等同于删除原列再新增列。
已尝试的无效代码
public static void renameColumn(GridStore store) throws GSException { ContainerInfo conInfo = store.getContainerInfo("wind"); var newColumnList = IntStream.range(0, conInfo.getColumnCount()) .mapToObj(conInfo::getColumnInfo) .map(col -> col.getName().equals("diretction") ? new ColumnInfo("direction", col.getType()) : col ).toList(); conInfo.setColumnInfoList(newColumnList); store.putTimeSeries("wind", conInfo, true); }
正确解决方案
GridDB没有直接重命名列的原生API,要保留数据需分三步操作:
- 新增目标列:添加一个与原列类型一致的新列
direction - 迁移数据:将原列
diretction的数据批量复制到新列 - 删除原列:确认数据迁移完成后,移除错误列
完整Java代码示例
import java.util.Date; import java.util.List; import java.util.stream.Collectors; import com.toshiba.mwcloud.gs.ColumnInfo; import com.toshiba.mwcloud.gs.ContainerInfo; import com.toshiba.mwcloud.gs.GSDataType; import com.toshiba.mwcloud.gs.GSException; import com.toshiba.mwcloud.gs.GridStore; import com.toshiba.mwcloud.gs.Query; import com.toshiba.mwcloud.gs.RowKey; import com.toshiba.mwcloud.gs.RowSet; import com.toshiba.mwcloud.gs.TimeSeries; public class GridDbColumnRename { public static void renameColumnWithDataPreserved(GridStore store) throws GSException { // 获取TimeSeries容器 TimeSeries<WindData> windTs = store.getTimeSeries("wind", WindData.class); // 步骤1:添加新列direction(类型与原列保持一致) ContainerInfo conInfo = windTs.getContainerInfo(); ColumnInfo newColumn = new ColumnInfo("direction", GSDataType.INTEGER); conInfo.addColumnInfo(newColumn); store.putTimeSeries("wind", conInfo, true); // 步骤2:批量迁移数据 Query<WindData> query = windTs.query("select *"); RowSet<WindData> rowSet = query.fetch(); while (rowSet.hasNext()) { WindData data = rowSet.next(); data.setDirection(data.getDiretction()); // 将原列值赋值给新列 windTs.put(data); } // 步骤3:删除原错误列diretction conInfo = store.getContainerInfo("wind"); List<ColumnInfo> updatedColumns = conInfo.getColumnInfoList().stream() .filter(col -> !col.getName().equals("diretction")) .collect(Collectors.toList()); conInfo.setColumnInfoList(updatedColumns); store.putTimeSeries("wind", conInfo, true); } // 对应的实体类(需同步新增direction字段) static class WindData { @RowKey private Date date; private Integer speed; private Integer diretction; // 原错误列 private Integer direction; // 新列 // Getter & Setter public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public Integer getSpeed() { return speed; } public void setSpeed(Integer speed) { this.speed = speed; } public Integer getDiretction() { return diretction; } public void setDiretction(Integer diretction) { this.diretction = diretction; } public Integer getDirection() { return direction; } public void setDirection(Integer direction) { this.direction = direction; } } }
优化建议
- 如果数据量较大,遍历单条数据效率偏低,可以使用GridDB的SQL批量更新语句:
UPDATE wind SET direction = diretction,能大幅提升迁移速度。 - 操作前务必备份容器数据,避免意外情况导致数据丢失。
内容的提问来源于stack exchange,提问作者Anthony Raymond
相关产品推荐
相关产品推荐

