如何在clickhouse中添加一列
How to add a column in clickhouse
我在 clickhouse 中有一个 table,比如说 "my_table",它有重复项(my_table_rep1,...)。我需要添加一列,类型为 float64,默认值为 (-1)。
我应该怎么做?
我希望默认值不会实际添加到现有条目中。
documentation 非常简单:
ALTER TABLE [db].name [ON CLUSTER cluster] ADD COLUMN name [type] [default_expr] [AFTER name_after]
关于:
I would prefer that the default are not actually added to existing entries.
文档中也有声明:
If you add a new column to a table but later change its default expression, the values used for old data will change (for data where values were not stored on the disk)
所以,基本上,您必须:
- 添加一列(没有默认值,或带有
DEFAULT 0
,或带有其他内容 - 取决于您希望在现有条目中包含什么)
- 执行
OPTIMIZE TABLE .. FINAL
强制Clickhouse将新数据写入磁盘
- 修改列并设置 DEFAULT -1,这样只有新行会受到影响
一个例子:
:) CREATE TABLE my_table (date Date DEFAULT today(), s String) ENGINE = MergeTree(date, (date), 8192);
:) INSERT INTO my_table (s) VALUES ('1. foo');
:) ALTER TABLE my_table ADD COLUMN f Float64;
:) INSERT INTO my_table (s) VALUES ('2. bar');
:) SELECT * FROM my_table;
┌───────date─┬─s──────┬─f─┐
│ 2018-04-20 │ 1. foo │ 0 │
│ 2018-04-20 │ 2. bar │ 0 │
└────────────┴────────┴───┘
:) OPTIMIZE TABLE my_table PARTITION 201804 FINAL;
:) ALTER TABLE my_table MODIFY COLUMN f Float64 DEFAULT -1;
:) INSERT INTO my_table (s) VALUES ('3. baz');
:) SELECT * FROM my_table;
┌───────date─┬─s──────┬──f─┐
│ 2018-04-20 │ 3. baz │ -1 │
│ 2018-04-20 │ 1. foo │ 0 │
│ 2018-04-20 │ 2. bar │ 0 │
└────────────┴────────┴────┘
你真的必须这样做 OPTIMIZE TABLE ... FINAL
,因为如果你不这样做,就会发生奇怪的事情:https://gist.github.com/hatarist/5e7653808e59349c34d4589b2fc69b14
我在 clickhouse 中有一个 table,比如说 "my_table",它有重复项(my_table_rep1,...)。我需要添加一列,类型为 float64,默认值为 (-1)。
我应该怎么做?
我希望默认值不会实际添加到现有条目中。
documentation 非常简单:
ALTER TABLE [db].name [ON CLUSTER cluster] ADD COLUMN name [type] [default_expr] [AFTER name_after]
关于:
I would prefer that the default are not actually added to existing entries.
文档中也有声明:
If you add a new column to a table but later change its default expression, the values used for old data will change (for data where values were not stored on the disk)
所以,基本上,您必须:
- 添加一列(没有默认值,或带有
DEFAULT 0
,或带有其他内容 - 取决于您希望在现有条目中包含什么) - 执行
OPTIMIZE TABLE .. FINAL
强制Clickhouse将新数据写入磁盘 - 修改列并设置 DEFAULT -1,这样只有新行会受到影响
一个例子:
:) CREATE TABLE my_table (date Date DEFAULT today(), s String) ENGINE = MergeTree(date, (date), 8192);
:) INSERT INTO my_table (s) VALUES ('1. foo');
:) ALTER TABLE my_table ADD COLUMN f Float64;
:) INSERT INTO my_table (s) VALUES ('2. bar');
:) SELECT * FROM my_table;
┌───────date─┬─s──────┬─f─┐
│ 2018-04-20 │ 1. foo │ 0 │
│ 2018-04-20 │ 2. bar │ 0 │
└────────────┴────────┴───┘
:) OPTIMIZE TABLE my_table PARTITION 201804 FINAL;
:) ALTER TABLE my_table MODIFY COLUMN f Float64 DEFAULT -1;
:) INSERT INTO my_table (s) VALUES ('3. baz');
:) SELECT * FROM my_table;
┌───────date─┬─s──────┬──f─┐
│ 2018-04-20 │ 3. baz │ -1 │
│ 2018-04-20 │ 1. foo │ 0 │
│ 2018-04-20 │ 2. bar │ 0 │
└────────────┴────────┴────┘
你真的必须这样做 OPTIMIZE TABLE ... FINAL
,因为如果你不这样做,就会发生奇怪的事情:https://gist.github.com/hatarist/5e7653808e59349c34d4589b2fc69b14