This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 27d84eafc5 [feature](alter) support rename column for table with unique column id (#13410) 27d84eafc5 is described below commit 27d84eafc5b549d5e07b2bf0ff6566a5126a75ba Author: Xin Liao <liaoxin...@126.com> AuthorDate: Fri Oct 21 08:45:34 2022 +0800 [feature](alter) support rename column for table with unique column id (#13410) --- .../Alter/ALTER-TABLE-RENAME.md | 18 ++ .../Alter/ALTER-TABLE-RENAME.md | 18 ++ .../main/java/org/apache/doris/catalog/Env.java | 109 ++++++++- .../org/apache/doris/journal/JournalEntity.java | 6 + .../java/org/apache/doris/persist/EditLog.java | 9 + .../org/apache/doris/persist/OperationType.java | 1 + .../doris/persist/TableRenameColumnInfo.java | 101 +++++++++ .../data/schema_change_p0/test_rename_column.out | Bin 0 -> 4101 bytes .../schema_change_p0/test_rename_column.groovy | 245 +++++++++++++++++++++ 9 files changed, 504 insertions(+), 3 deletions(-) diff --git a/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-RENAME.md b/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-RENAME.md index 55e6376906..042488a335 100644 --- a/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-RENAME.md +++ b/docs/en/docs/sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-RENAME.md @@ -66,6 +66,18 @@ grammar: RENAME PARTITION old_partition_name new_partition_name; ``` +4. Modify the column name + +grammar: + +```sql +RENAME COLUMN old_column_name new_column_name; +``` + +Notice: +- Currently only tables with column unique id are supported, which are created with property 'light_schema_change'. + + ### Example 1. Modify the table named table1 to table2 @@ -86,6 +98,12 @@ ALTER TABLE example_table RENAME ROLLUP rollup1 rollup2; ALTER TABLE example_table RENAME PARTITION p1 p2; ``` +4. Modify the column named c1 in the table example_table to c2 + +```sql +ALTER TABLE example_table RENAME COLUMN c1 c2; +``` + ### Keywords ```text diff --git a/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-RENAME.md b/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-RENAME.md index 9d3fa414b8..42b3c08fcc 100644 --- a/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-RENAME.md +++ b/docs/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Alter/ALTER-TABLE-RENAME.md @@ -66,6 +66,18 @@ RENAME ROLLUP old_rollup_name new_rollup_name; RENAME PARTITION old_partition_name new_partition_name; ``` +4.修改 column 名称 + +语法: + +```sql +RENAME COLUMN old_column_name new_column_name; +``` + +注意: +- 目前仅支持有 column unique id 的表, 通过 'light_schema_change' 属性创建。 + + ### Example 1. 将名为 table1 的表修改为 table2 @@ -86,6 +98,12 @@ ALTER TABLE example_table RENAME ROLLUP rollup1 rollup2; ALTER TABLE example_table RENAME PARTITION p1 p2; ``` +4. 将表 example_table 中名为 c1 的 column 修改为 c2 + +```sql +ALTER TABLE example_table RENAME COLUMN c1 c2; +``` + ### Keywords ```text diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java index 28eb754b6b..f62f81ea54 100755 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java @@ -190,6 +190,7 @@ import org.apache.doris.persist.StorageInfo; import org.apache.doris.persist.StorageInfoV2; import org.apache.doris.persist.TableInfo; import org.apache.doris.persist.TablePropertyInfo; +import org.apache.doris.persist.TableRenameColumnInfo; import org.apache.doris.persist.TruncateTableInfo; import org.apache.doris.persist.meta.MetaHeader; import org.apache.doris.persist.meta.MetaReader; @@ -4030,12 +4031,114 @@ public class Env { } } + public void renameColumn(Database db, OlapTable table, String colName, + String newColName, boolean isReplay) throws DdlException { + if (table.getState() != OlapTableState.NORMAL) { + throw new DdlException("Table[" + table.getName() + "] is under " + table.getState()); + } + + if (colName.equalsIgnoreCase(newColName)) { + throw new DdlException("Same column name"); + } + + Map<Long, MaterializedIndexMeta> indexIdToMeta = table.getIndexIdToMeta(); + for (Map.Entry<Long, MaterializedIndexMeta> entry : indexIdToMeta.entrySet()) { + // rename column is not implemented for table without column unique id. + if (entry.getValue().getMaxColUniqueId() < 0) { + throw new DdlException("not implemented for table without column unique id," + + " which are created with property 'light_schema_change'."); + } + // check if new name is already used + if (entry.getValue().getColumnByName(newColName) != null) { + throw new DdlException("Column name[" + newColName + "] is already used"); + } + } + + // 1. modify MaterializedIndexMeta + boolean hasColumn = false; + for (Map.Entry<Long, MaterializedIndexMeta> entry : indexIdToMeta.entrySet()) { + Column column = entry.getValue().getColumnByName(colName); + if (column != null) { + column.setName(newColName); + hasColumn = true; + } + } + if (!hasColumn) { + throw new DdlException("Column[" + colName + "] does not exists"); + } + + // 2. modify partition key + PartitionInfo partitionInfo = table.getPartitionInfo(); + List<Column> partitionColumns = partitionInfo.getPartitionColumns(); + for (Column column : partitionColumns) { + if (column.getName().equalsIgnoreCase(colName)) { + column.setName(newColName); + break; + } + } + + // 3. modify index + List<Index> indexes = table.getIndexes(); + for (Index index : indexes) { + List<String> columns = index.getColumns(); + for (int i = 0; i < columns.size(); i++) { + if (columns.get(i).equalsIgnoreCase(colName)) { + columns.set(i, newColName); + } + } + } + + // 4. modify distribution info + DistributionInfo distributionInfo = table.getDefaultDistributionInfo(); + if (distributionInfo.getType() == DistributionInfoType.HASH) { + List<Column> distributionColumns = ((HashDistributionInfo) distributionInfo).getDistributionColumns(); + for (Column column : distributionColumns) { + if (column.getName().equalsIgnoreCase(colName)) { + column.setName(newColName); + break; + } + } + } + + table.rebuildFullSchema(); + + if (!isReplay) { + // log + TableRenameColumnInfo info = new TableRenameColumnInfo(db.getId(), table.getId(), colName, newColName); + editLog.logColumnRename(info); + LOG.info("rename coloumn[{}] to {}", colName, newColName); + } + } + public void renameColumn(Database db, OlapTable table, ColumnRenameClause renameClause) throws DdlException { - throw new DdlException("not implemented"); + table.writeLockOrDdlException(); + try { + String colName = renameClause.getColName(); + String newColName = renameClause.getNewColName(); + renameColumn(db, table, colName, newColName, false); + } finally { + table.writeUnlock(); + } } - public void replayRenameColumn(TableInfo tableInfo) throws DdlException { - throw new DdlException("not implemented"); + public void replayRenameColumn(TableRenameColumnInfo info) throws MetaNotFoundException { + LOG.debug("info:{}", info); + long dbId = info.getDbId(); + long tableId = info.getTableId(); + String colName = info.getColName(); + String newColName = info.getNewColName(); + + Database db = getCurrentEnv().getInternalCatalog().getDbOrMetaException(dbId); + OlapTable table = (OlapTable) db.getTableOrMetaException(tableId, TableType.OLAP); + table.writeLock(); + try { + renameColumn(db, table, colName, newColName, true); + } catch (DdlException e) { + // should not happen + LOG.warn("failed to replay rename column", e); + } finally { + table.writeUnlock(); + } } public void modifyTableDynamicPartition(Database db, OlapTable table, Map<String, String> properties) diff --git a/fe/fe-core/src/main/java/org/apache/doris/journal/JournalEntity.java b/fe/fe-core/src/main/java/org/apache/doris/journal/JournalEntity.java index 7782fdcd0f..d45ac59a35 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/journal/JournalEntity.java +++ b/fe/fe-core/src/main/java/org/apache/doris/journal/JournalEntity.java @@ -92,6 +92,7 @@ import org.apache.doris.persist.SetReplicaStatusOperationLog; import org.apache.doris.persist.TableAddOrDropColumnsInfo; import org.apache.doris.persist.TableInfo; import org.apache.doris.persist.TablePropertyInfo; +import org.apache.doris.persist.TableRenameColumnInfo; import org.apache.doris.persist.TruncateTableInfo; import org.apache.doris.plugin.PluginInfo; import org.apache.doris.policy.DropPolicyLog; @@ -256,6 +257,11 @@ public class JournalEntity implements Writable { isRead = true; break; } + case OperationType.OP_RENAME_COLUMN: { + data = TableRenameColumnInfo.read(in); + isRead = true; + break; + } case OperationType.OP_MODIFY_VIEW_DEF: { data = AlterViewInfo.read(in); isRead = true; diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java b/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java index f47f1314cf..4d6c0314b3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java +++ b/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java @@ -279,6 +279,11 @@ public class EditLog { env.replayRenamePartition(info); break; } + case OperationType.OP_RENAME_COLUMN: { + TableRenameColumnInfo info = (TableRenameColumnInfo) journal.getData(); + env.replayRenameColumn(info); + break; + } case OperationType.OP_BACKUP_JOB: { BackupJob job = (BackupJob) journal.getData(); env.getBackupHandler().replayAddJob(job); @@ -1220,6 +1225,10 @@ public class EditLog { logEdit(OperationType.OP_RENAME_PARTITION, tableInfo); } + public void logColumnRename(TableRenameColumnInfo info) { + logEdit(OperationType.OP_RENAME_COLUMN, info); + } + public void logCreateCluster(Cluster cluster) { logEdit(OperationType.OP_CREATE_CLUSTER, cluster); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/OperationType.java b/fe/fe-core/src/main/java/org/apache/doris/persist/OperationType.java index aa11dfdbed..e1064e22b1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/persist/OperationType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/persist/OperationType.java @@ -46,6 +46,7 @@ public class OperationType { public static final short OP_RECOVER_PARTITION = 18; public static final short OP_RENAME_TABLE = 19; public static final short OP_RENAME_PARTITION = 110; + public static final short OP_RENAME_COLUMN = 115; public static final short OP_BACKUP_JOB = 116; public static final short OP_RESTORE_JOB = 117; public static final short OP_TRUNCATE_TABLE = 118; diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/TableRenameColumnInfo.java b/fe/fe-core/src/main/java/org/apache/doris/persist/TableRenameColumnInfo.java new file mode 100644 index 0000000000..f7a388756d --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/persist/TableRenameColumnInfo.java @@ -0,0 +1,101 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.persist; + +import org.apache.doris.common.io.Text; +import org.apache.doris.common.io.Writable; +import org.apache.doris.persist.gson.GsonUtils; + +import com.google.gson.annotations.SerializedName; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +/** + * PersistInfo for Table rename column info + */ +public class TableRenameColumnInfo implements Writable { + @SerializedName(value = "dbId") + private long dbId; + @SerializedName(value = "tableId") + private long tableId; + @SerializedName(value = "colName") + private String colName; + @SerializedName(value = "newColName") + private String newColName; + + public TableRenameColumnInfo(long dbId, long tableId, + String colName, String newColName) { + this.dbId = dbId; + this.tableId = tableId; + this.colName = colName; + this.newColName = newColName; + } + + public long getDbId() { + return dbId; + } + + public long getTableId() { + return tableId; + } + + public String getColName() { + return colName; + } + + public String getNewColName() { + return newColName; + } + + @Override + public void write(DataOutput out) throws IOException { + Text.writeString(out, GsonUtils.GSON.toJson(this)); + } + + public static TableRenameColumnInfo read(DataInput in) throws IOException { + return GsonUtils.GSON.fromJson(Text.readString(in), TableRenameColumnInfo.class); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + + if (!(obj instanceof TableRenameColumnInfo)) { + return false; + } + + TableRenameColumnInfo info = (TableRenameColumnInfo) obj; + + return (dbId == info.dbId && tableId == tableId + && colName.equals(info.colName) && newColName.equals(info.newColName)); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(" dbId: ").append(dbId); + sb.append(" tableId: ").append(tableId); + sb.append(" colName: ").append(colName); + sb.append(" newColName: ").append(newColName); + return sb.toString(); + } +} diff --git a/regression-test/data/schema_change_p0/test_rename_column.out b/regression-test/data/schema_change_p0/test_rename_column.out new file mode 100644 index 0000000000..5bfcba17d8 Binary files /dev/null and b/regression-test/data/schema_change_p0/test_rename_column.out differ diff --git a/regression-test/suites/schema_change_p0/test_rename_column.groovy b/regression-test/suites/schema_change_p0/test_rename_column.groovy new file mode 100644 index 0000000000..aeb2de2ca4 --- /dev/null +++ b/regression-test/suites/schema_change_p0/test_rename_column.groovy @@ -0,0 +1,245 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +suite ("test_rename_column") { + def tableName = "rename_column_test" + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ + CREATE TABLE ${tableName} ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `city` VARCHAR(20) COMMENT "用户所在城市", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `last_visit_date` DATETIME DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `last_update_date` DATETIME DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次更新时间", + `last_visit_date_not_null` DATETIME NOT NULL DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `cost` BIGINT DEFAULT "0" COMMENT "用户总消费", + `max_dwell_time` INT DEFAULT "0" COMMENT "用户最大停留时间", + `min_dwell_time` INT DEFAULT "99999" COMMENT "用户最小停留时间") + UNIQUE KEY(`user_id`, `date`, `city`, `age`, `sex`) DISTRIBUTED BY HASH(`user_id`) + PROPERTIES ( "replication_num" = "1" , "light_schema_change" = "true") + """ + qt_desc """ desc ${tableName} """ + + sql """ + INSERT INTO ${tableName} VALUES + (1, '2017-10-01', 'Beijing', 10, 1, '2020-01-01', '2020-01-01', '2020-01-01', 1, 30, 20) + """ + sql """ + INSERT INTO ${tableName} VALUES + (2, '2017-10-01', 'Beijing', 10, 1, '2020-01-02', '2020-01-02', '2020-01-02', 1, 31, 21) + """ + sql """ sync """ + + qt_select """ SELECT * FROM ${tableName} order by user_id ASC, last_visit_date """ + + // rename key column + sql """ ALTER table ${tableName} RENAME COLUMN user_id new_user_id """ + + sql """ sync """ + + qt_select """ SELECT * FROM ${tableName} order by new_user_id DESC, last_visit_date """ + + qt_desc """ desc ${tableName} """ + + sql """ + INSERT INTO ${tableName} VALUES + (3, '2017-10-01', 'Beijing', 10, 1, '2020-01-01', '2020-01-01', '2020-01-01', 1, 32, 22) + """ + qt_select """ SELECT * FROM ${tableName} order by new_user_id DESC, last_visit_date """ + + // rename value column + sql """ + ALTER table ${tableName} RENAME COLUMN max_dwell_time new_max_dwell_time + """ + sql """ + INSERT INTO ${tableName} VALUES + (4, '2017-10-01', 'Beijing', 10, 1, '2020-01-02', '2020-01-02', '2020-01-02', 1, 33, 23) + """ + sql """ sync """ + + qt_select """ SELECT * FROM ${tableName} order by new_user_id DESC, last_visit_date """ + + qt_desc """ desc ${tableName} """ + + test { + sql """ ALTER table ${tableName} RENAME COLUMN date city """ + exception "Column name[city] is already used" + } + + test { + sql """ ALTER table ${tableName} RENAME COLUMN aaa bbb """ + exception "Column[aaa] does not exists" + } + + test { + sql """ ALTER table ${tableName} RENAME COLUMN date date """ + exception "Same column name" + } + + sql """ DROP TABLE ${tableName} """ + + // table without column unique id + sql """ + CREATE TABLE ${tableName} ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `city` VARCHAR(20) COMMENT "用户所在城市", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `last_visit_date` DATETIME DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `last_update_date` DATETIME DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次更新时间", + `last_visit_date_not_null` DATETIME NOT NULL DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间", + `cost` BIGINT DEFAULT "0" COMMENT "用户总消费", + `max_dwell_time` INT DEFAULT "0" COMMENT "用户最大停留时间", + `min_dwell_time` INT DEFAULT "99999" COMMENT "用户最小停留时间") + UNIQUE KEY(`user_id`, `date`, `city`, `age`, `sex`) DISTRIBUTED BY HASH(`user_id`) + PROPERTIES ( "replication_num" = "1" , "light_schema_change" = "false") + """ + test { + sql """ ALTER table ${tableName} RENAME COLUMN date new_date """ + exception "not implemented" + } + sql """ DROP TABLE ${tableName} """ + + // rollup + sql """ + CREATE TABLE ${tableName} ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `city` VARCHAR(20) COMMENT "用户所在城市", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费", + `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间", + `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间", + `hll_col` HLL HLL_UNION NOT NULL COMMENT "HLL列", + `bitmap_col` Bitmap BITMAP_UNION NOT NULL COMMENT "bitmap列") + AGGREGATE KEY(`user_id`, `date`, `city`, `age`, `sex`) DISTRIBUTED BY HASH(`user_id`) + BUCKETS 1 + PROPERTIES ( "replication_num" = "1", "light_schema_change" = "true" ); + """ + qt_desc """ desc ${tableName} """ + + //add rollup + def resRoll = "null" + def rollupName = "rollup_cost" + sql "ALTER TABLE ${tableName} ADD ROLLUP ${rollupName}(`user_id`, `cost`);" + while (!resRoll.contains("FINISHED")){ + resRoll = sql "SHOW ALTER TABLE ROLLUP WHERE TableName='${tableName}' ORDER BY CreateTime DESC LIMIT 1;" + resRoll = resRoll.toString() + logger.info("result: ${resRoll}") + if(resRoll.contains("CANCELLED")){ + return + } + Thread.sleep(500) + } + + qt_select """ select user_id, cost from ${tableName} order by user_id """ + + sql """ INSERT INTO ${tableName} VALUES + (1, '2017-10-01', 'Beijing', 10, 1, 1, 30, 20, hll_hash(1), to_bitmap(1)) + """ + sql """ INSERT INTO ${tableName} VALUES + (1, '2017-10-02', 'Beijing', 10, 1, 1, 31, 19, hll_hash(2), to_bitmap(2)) + """ + sql """ sync """ + + qt_select """ select * from ${tableName} order by user_id """ + + qt_select """ select user_id, sum(cost) from ${tableName} group by user_id order by user_id """ + + sql """ ALTER TABLE ${tableName} RENAME COLUMN user_id new_user_id """ + + sql """ INSERT INTO ${tableName} VALUES + (2, '2017-10-01', 'Beijing', 10, 1, 1, 31, 21, hll_hash(2), to_bitmap(2)) + """ + sql """ INSERT INTO ${tableName} VALUES + (2, '2017-10-02', 'Beijing', 10, 1, 1, 32, 20, hll_hash(3), to_bitmap(3)) + """ + qt_desc """ desc ${tableName} """ + + qt_select""" select * from ${tableName} order by new_user_id """ + + qt_select """ select new_user_id, sum(cost) from ${tableName} group by new_user_id order by new_user_id """ + + sql """ DROP TABLE ${tableName} """ + + // materialized view + sql """ + CREATE TABLE ${tableName} ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `city` VARCHAR(20) COMMENT "用户所在城市", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费", + `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间", + `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间", + `hll_col` HLL HLL_UNION NOT NULL COMMENT "HLL列", + `bitmap_col` Bitmap BITMAP_UNION NOT NULL COMMENT "bitmap列") + AGGREGATE KEY(`user_id`, `date`, `city`, `age`, `sex`) DISTRIBUTED BY HASH(`user_id`) + BUCKETS 1 + PROPERTIES ( "replication_num" = "1", "light_schema_change" = "true" ); + """ + + //add materialized view + def resMv = "null" + def mvName = "mv1" + sql "create materialized view ${mvName} as select user_id, sum(cost) from ${tableName} group by user_id;" + while (!resMv.contains("FINISHED")){ + resMv = sql "SHOW ALTER TABLE MATERIALIZED VIEW WHERE TableName='${tableName}' ORDER BY CreateTime DESC LIMIT 1;" + resMv = resMv.toString() + logger.info("result: ${resMv}") + if(resMv.contains("CANCELLED")){ + return + } + Thread.sleep(500) + } + + qt_select """ select user_id, cost from ${tableName} order by user_id """ + + sql """ INSERT INTO ${tableName} VALUES + (1, '2017-10-01', 'Beijing', 10, 1, 1, 30, 20, hll_hash(1), to_bitmap(1)) + """ + sql """ INSERT INTO ${tableName} VALUES + (1, '2017-10-02', 'Beijing', 10, 1, 1, 31, 19, hll_hash(2), to_bitmap(2)) + """ + sql """ sync """ + + qt_select """ select * from ${tableName} order by user_id """ + + qt_select """ select user_id, sum(cost) from ${tableName} group by user_id order by user_id """ + + sql """ ALTER TABLE ${tableName} RENAME COLUMN user_id new_user_id """ + + sql """ INSERT INTO ${tableName} VALUES + (2, '2017-10-01', 'Beijing', 10, 1, 1, 31, 21, hll_hash(2), to_bitmap(2)) + """ + sql """ INSERT INTO ${tableName} VALUES + (2, '2017-10-02', 'Beijing', 10, 1, 1, 32, 20, hll_hash(3), to_bitmap(3)) + """ + qt_desc """ desc ${tableName} """ + + qt_select""" select * from ${tableName} order by new_user_id """ + + qt_select """ select new_user_id, sum(cost) from ${tableName} group by new_user_id order by new_user_id """ + + sql """ DROP TABLE ${tableName} """ + +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org