专业的编程技术博客社区

网站首页 > 博客文章 正文

clickhouse的技术文档--后面有安装文档

baijin 2024-10-17 07:48:25 博客文章 8 ℃ 0 评论

Clickhouse是什么?

注意:严格却分大小写

是俄罗斯的yandex于2016年开源的列式存储数据库(DBMS),主要用于在线分析初六查询(OLAP),能够使用sql查询实时生成分析数据报告

列式和行式的存储区别?


?行式存储


?列式存储

数据类型:

?整型:

–固定长度的整型,包括有符号整型或无符号整型

–整型范围(-2n-~2n-1-1)

?Int8 - [-128 : 127] Int16 - [-32768 : 32767] Int32 - [-2147483648 : 2147483647] Int64 - [-9223372036854775808 : 9223372036854775807] 无符号整型范围(0~2n-1):UInt8 - [0 : 255] UInt16 - [0 : 65535] UInt32 - [0 : 4294967295] UInt64 - [0 : 18446744073709551615]

?浮点型

–Float32--float

–Float64--double

–建议以整数行式存储,浮点型计算有可能引起误差

–:) select 1-0.9
┌───────minus(1, 0.9)─┐
│ 0.09999999999999998 │
└─────────────────────┘

clickhouse支持的类别的浮点数

?inf-正负穷

?:) select 1/0
┌─divide(1, 0)─┐
│ inf │
└──────────────┘

–-inf-负无穷

?:) select -1/0
┌─divide(1, 0)─┐
│ -inf │
└──────────────┘

–NaN-非数子

?:) select 0/0
┌─divide(0, 0)─┐
│ nan │
└──────────────┘

?布尔型

–没有单独的类型存储布尔型,可以用Uint8类型,取值限制为0or1.

?字符串

–string

?字符串可以任意长度,包含任意的字节集,含空字节

–FixedString(N)

?固定长度n的字符串

?n必须是严格的正自热数

?当服务端读取长度小于n的字符串时候,通过字符串末尾添加空字节来达到 N 字节长度。

?当服务端读取长度大于 N 的字符串时候,将返回错误消息。

–建议使用String,FicedString使用不方便

?枚举类型

–包括 Enum8 和 Enum16 类型。

–Enum 保存 'string'= integer 的对应关系。

–Enum8 用 'String'= Int8 对描述。

–Enum16 用 'String'= Int16 对描述。

–例子:

?创建一个带有一个枚举Enum8('hello')=1,'word'=2)类型的列:

–CREATE TABLE t_enum
(
x Enum8('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog

–x列只可以存储类型定义的列出的值:hello'或'world'。如果尝试保存任何其他值,ClickHouse 抛出异常。

?:) INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')
INSERT INTO t_enum VALUES
Ok.
3 rows in set. Elapsed: 0.002 sec.
:) insert into t_enum values('a')
INSERT INTO t_enum VALUES
Exception on client:
Code: 49. DB::Exception: Unknown element 'a' for type Enum8('hello' = 1, 'world' = 2)

–从表中查询数据时,ClickHouse 从 Enum 中输出字符串值。

?SELECT * FROM t_enum
┌─x─────┐
│ hello │
│ world │
│ hello │
└───────┘

–如果需要看到对应行的数值,则必须将 Enum 值转换为整数类型。

?SELECT CAST(x, 'Int8') FROM t_enum
//使用cast看x的类型是什么,因为没有布尔值,之前设置的时候Enum8(可以设置任何 'string'= integer 的对应关系)
┌─CAST(x, 'Int8')─┐
│ 1 │
│ 2 │
│ 1 │
└─────────────────┘

?数组

–Array(T):由 T 类型元素组成的数组。T 可以是任意类型,包含数组类型。但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。例如,不能在 MergeTree 表中存储多维数组。可以使用array函数来创建数组:

?array(T)//值为单一,不能混的类型

也可以包含中括号

[]

?

–创建数组案例

?:) SELECT array(1, 2) AS x, toTypeName(x)
SELECT
[1, 2] AS x,
toTypeName(x)//创建一个数组名为x,值为1,2
┌─x─────┬─toTypeName(array(1, 2))─┐
│ [1,2] │ Array(UInt8) │
└───────┴─────────────────────────┘
1 rows in set. Elapsed: 0.002 sec.
:) SELECT [1, 2] AS x, toTypeName(x)
SELECT
[1, 2] AS x,
toTypeName(x)
┌─x─────┬─toTypeName([1, 2])─┐
│ [1,2] │ Array(UInt8) │
└───────┴────────────────────┘
1 rows in set. Elapsed: 0.002 sec.

?元组

–Tuple(T1, T2, ...):元组,其中每个元素都有单独的类型。

–例子:

?:) SELECT tuple(1,'a') AS x, toTypeName(x)
SELECT
(1, 'a') AS x,
toTypeName(x)
//元组是可以类型混的
┌─x───────┬─toTypeName(tuple(1, 'a'))─┐
│ (1,'a') │ Tuple(UInt8, String) │
└─────────┴───────────────────────────┘
1 rows in set. Elapsed: 0.021 sec.

?Date

–ri日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值。

–https://clickhouse.yandex/docs/zh/data_types/------官网

引擎:

表格引擎:

?数据的存储方式和位置,写入位置和读取位置

?如何支持哪些查询

?并发数据访问

?如果存在使用索引

?是否可以执行多线程请求。

?数据复制参数

引擎种类

?TinyLog

–最简单的引擎

–用于将数据存储在磁盘上

–不支持索引

–没有并发控控制(同时:读/写,读写)

–每列都存储在单独的压缩文件中

–小表多时候的可以用

–把数据放到表里,以后的增删改不做操作,只查询

?若同时从表中读取和写入数据,则读取操作将抛异常

?若同时写入多个查询中的表,则数据将被破坏

–这种表引擎的典型用法是 write-once:首先只写入一次数据,然后根据需要多次读取。此引擎适用于相对较小的表(建议最多1,000,000行)。如果有许多小表,则使用此表引擎是适合的,因为它比需要打开的文件更少。当拥有大量小表时,可能会导致性能低下。不支持索引。

–例子:

?:)create table t (a UInt16, b String) ENGINE=TinyLog;
:)insert into t (a, b) values (1, 'abc');

–此时我们保存数据的目录/var/lib/clickhouse/data/default/t可以看到如下

?[root@hadoop102 t]# ls
a.bin b.bin sizes.json

–a.bin金额和b.bin时压缩过的对应的列的数据,sizes.json中记录了每个*.bin文件的大小

?[root@hadoop102 t]# cat sizes.json
{"yandex":{"a%2Ebin":{"size":"28"},"b%2Ebin":{"size":"30"}}}

?Memory

–内存引擎,数据以未压缩的原始行式直接存储在内存中服务器重启数据就没了

–读写操作不会相会阻塞

–不支持索引

–简单查询非常高的性能表现(超10G/s)

–用它的地方不多,除了测试

–适用场景:要求高性能,数据流不大的情况下

?Merge

–merge引擎本身不存储数据,但是可用于同时从任意多个其他表中读取数据

–涉及到参数,合并在那里

–读时自动并行,不支持写入

–读取,那些被真正读取到数据的表的索引会被使用

–merge引擎的参数:一个数据库名+一个用于匹配表名的正则表达式

–例子:

?:)create table t1 (id UInt16, name String) ENGINE=TinyLog;
:)create table t2 (id UInt16, name String) ENGINE=TinyLog;
:)create table t3 (id UInt16, name String) ENGINE=TinyLog;
:)insert into t1(id, name) values (1, 'first');
:)insert into t2(id, name) values (2, 'second');
:)insert into t3(id, name) values (3, 'i am in t3');
:)create table t (id UInt16, name String) ENGINE=Merge(currentDatabase(), '^t');
//currentDatabase是当前数据库,所有以t开头的
:) select * from t;
┌─id─┬─name─┐
│ 2 │ second │
└────┴──────┘
┌─id─┬─name──┐
│ 1 │ first │
└────┴───────┘
┌─id─┬─name───────┐
│ 3 │ i am in t3 │
└────┴────────────┘

?mergeTree(重点)

–是MergeTree系列中引擎最强大的表引擎

–该mergeTree系列的引擎是将大量数据插入表中,数据快速的逐个部分写入表中,应用规则在后台合并(按照分区和主键)部分合并

–这种方法比插入期间连续重写存储中的数据效率更高

–特点:

?存储按主键排序的数据

?若指定了分区键,就可以使用分区

–支持某些分区操作比对相同数据,相同结果的常规操作更有效

–自动切断在查询中指定了分区键的分区数据,提高查询性能

?数据支持复制

–ReplicatedMergeTree表提供数据复制

?数据采样支持

–如有必要,可以在表中设置数据采样方法

–格式:

?CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
[PARTITION BY expr] //只能按照日期分区
[ORDER BY expr] //可以一个或多个字段排序
[PRIMARY KEY expr] //默认和order by的排序一样的主键,若指定主键,就和order by排序的不同
[SAMPLE BY expr] //可以不写,若是写,主键必须包含这些表达式
[SETTINGS name=value, ...] //设置额外性能

–engine:

?引擎名和参数,engine=mergeTree().MergeTree引擎没有参数

–partition by---分区键

?只能按月分区:toyyyymm(date_column)

?旧版本:只能写到201907/08,无法写日期

?新版本:可以写到日,调用自己的函数

–order by ---表的排序键

?可以是一组列的元祖或任意的表达式

?order by(CounterID,EventDate)

–primary key -------主键,可以和排序键不同

?默认情况下和order by相同

?大部分情况下不需要指定设置primary key

–sample by--------用于抽样

?用到抽样,主键必须包含

?sample by intHash32(userID) order by (CounterID,EventDate,intHash32(UserID))

–settings---影响mergeTree性能的额外参数

?index_granularity---索引粒度,就是索引中相邻[标记]间的数据行数

–默认是:8192

–就是支持索引,每个索引有多少行

?indexgranularitybytes----索引粒度,以字节为单位

–默认值:10Mb

–若仅按数据行数限制索引粒度,设置为0(不建议)

?enablemixedgranularityparts-----启用或禁用通过indexgranularity_bytes控制索引粒度的大小

–通过这个配置可以提升select查询性能

?useminimalisticpartheaderin_zookeeper-----数据片段头在Zookeeper中的存储方式

–useminimalisticpartheaderin_zookeeper=1,zookeeper会存储更少的数据

–控制在zookeeper的存储的方式

–设置1就支持元数据了

?minmergebytestousedirectio---使用直接I/O来操作磁盘的合并操作要求的最小数据量

–默认10G

–合并数据片段,clickHouse计算要被合并的所有数据的总存储空间

–设置minmergebytestousedirectio的字节数,clickHouse将使用直接I/O接口对磁盘读写

–设置Minmergebytestousedirectio=0就会禁用直接I/O,默认值:1010241024*1024字节

–超过这个参数,linux会直接调取直接I/O

–Lunix的I/O方式;

?直接I/O

–没有缓存,直接放到磁盘,数据量小,反而没有缓存I/o块

–数据量特别大,可以适用

?缓存I/O(默认)

–涉及到缓存,数据——>缓存--》磁盘,数据还是很快

?mergewithttl_timeout:------TTL合并频率的最小间隔时间,默认值:86400(1天)

?writefinalmark---启用或禁用在数据片尾写入最终索引标记,默认值:1(不建议更改)

?storage_policy-----存储策略

?optimzize table mt_table;------有可能会刷新出现问题

?举例:

ENGINE MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity=8192

?*.bin时按列保存数据的文件

?*。mrk保存块偏移量

?primary.idx保存主键索引

?进入路径:cd /var/lib/clickhouse

?

?

–checksums.txt----对应的列,类型

?

?

–count.txt---文件总数--1

?

?

–date.bin/id.bin/name.bin----都是路径

–date.mrk------每列数据的偏移量

–minman_date----存入最小/大的时间

–partition.dat-----分区信息

–partmary.idx------主键

?ReplacingMergeTree

–这个引擎是在 MergeTree 的基础上,添加了“处理重复数据”的功能

–该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项

–数据的去重只会在合并的过程中出现。合并会在未知的时间在后台进行,所以你无法预先作出计划。

–有一些数据可能仍未被处理。

?因此,ReplacingMergeTree 适用于在后台清除重复的数据以节省空间,

?但是它不保证没有重复的数据出现。

–格式:

?ENGINE=ReplacingMergeTree([ver]) ver:版本列,类型为Uint*,Date或DateTime
[PARIRION BY expr] 合并的式,ReplacingMergetree从所有具有相同主键的行中选择一行留下,若ver列未指定,选择最后一条,ver制定了选择ver值最大的版本
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value,....]

–比MergeTree只多了一个ver,这个ver指代版本列,他和时间一起配置,区分哪条数据是最新的。

–例子;

?create table rmt_table (date Date, id UInt8, name String,point UInt8)//pont就是ver
ENGINE= ReplacingMergeTree(pont) //选择point版本列,由这个决定谁留
partition by date
order by (id,name)
插入一些数据:
insert into rmt_table values ('2019-07-10', 1, 'a', 20);
insert into rmt_table values ('2019-07-10', 1, 'a', 30);
insert into rmt_table values ('2019-07-11', 1, 'a', 20);
insert into rmt_table values ('2019-07-11', 1, 'a', 30);
insert into rmt_table values ('2019-07-11', 1, 'a', 10);
等待一段时间或optimize table rmt_table手动触发merge,后查询
:) select * from rmt_table;
┌───────date─┬─id─┬─name─┬─point─┐
│ 2019-07-11 │ 1 │ a │ 30 │
└────────────┴────┴──────┴───────┘

?SummingMergeTree

–继承自 MergeTree

–区别在于,当合并 SummingMergeTree 表的数据片段时,ClickHouse 会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值

–如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度,对于不可加的列,会取一个最先出现的值。

–不可加的列

?会取最先出现的列

–格式

?ENGINE [=] SummingMergeTree( [columns])
[PARIRION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value,....]

–columns包含将要被汇总的列的列名的元组

–例子:

?create table smt_table (date Date, name String, a UInt16, b UInt16) ENGINE=SummingMergeTree(sum)
partiton by date
order by (date,name)//主键式相同时间相同的名字
插入数据:
insert into smt_table (date, name, a, b) values ('2019-07-10', 'a', 1, 2);
insert into smt_table (date, name, a, b) values ('2019-07-10', 'b', 2, 1);
insert into smt_table (date, name, a, b) values ('2019-07-11', 'b', 3, 8);
insert into smt_table (date, name, a, b) values ('2019-07-11', 'b', 3, 8);
insert into smt_table (date, name, a, b) values ('2019-07-11', 'a', 3, 1);
insert into smt_table (date, name, a, b) values ('2019-07-12', 'c', 1, 3);
等待一段时间或optimize table smt_table手动触发merge,后查询
:) select * from smt_table
┌───────date─┬─name─┬─a─┬─b─┐
│ 2019-07-10 │ a │ 1 │ 2 │
│ 2019-07-10 │ b │ 2 │ 1 │
│ 2019-07-11 │ a │ 3 │ 1 │
│ 2019-07-11 │ b │ 6 │ 8 │
│ 2019-07-12 │ c │ 1 │ 3 │
└────────────┴──────┴───┴───┘

–发现2019-07-11,b的a列合并相加了,b列取了8(因为b列为8的数据最先插入)。

–按时间,在按最少的数据,相加的

?Distributed

–分布式引擎,本身不存储数据, 但可以在多个服务器上进行分布式查询。

–和merge的不同是,其他集群的数据,merge是其他的表

–读是自动并行的。读取时,远程服务器表的索引(如果有的话)会被使用。

–格式:

?Distributed(cluster_name, database, table [, sharding_key])

–参数

?clustername - 服务器配置文件中的集群名(在vim /etc/metrika.xml)在/etc/metrika.xml中配置的 database – 数据库名 table – 表名 shardingkey – 数据分片键---在/etc/metrika.xml中配置的---一般不用

–插入的时候可以按照分片键,插入

?例子;

数据库引擎

?Mysql

?将远程的Mysql服务器中的表映射到ClickHouse中

?允许到表进行insert和select

?ClickHouse和Mysql之间进行数据交换

?此引擎会对查询的结果转换到mysql语法并发送到mysql服务器中

?支持操作show tables和show CREATE TABLE'

?不支持操作

–RENAME

–CREATE TABLE

–ALTER

?举例:create database

–CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')

–引擎参数

?host:port — 链接的MySQL地址。

?database — 链接的MySQL数据库。

?user — 链接的MySQL用户。

?password — 链接的MySQL用户密码

?可支持的参数

–快速使用案例

?mysql中创建表

–mysql> USE test;
Database changed
mysql> CREATE TABLE `mysql_table` (
-> `int_id` INT NOT NULL AUTO_INCREMENT,
-> `float` FLOAT NOT NULL,
-> PRIMARY KEY (`int_id`));
Query OK, 0 rows affected (0,09 sec)
mysql> insert into mysql_table (`int_id`, `float`) VALUES (1,2);
Query OK, 1 row affected (0,00 sec)
mysql> select * from mysql_table;
+--------+-------+
| int_id | value |
+--------+-------+
| 1 | 2 |
+--------+-------+
1 row in set (0,00 sec)

?在ClickHouse创建mysql类型的数据库,与mysql服务器交换

?CREATE DATABASE mysql_db ENGINE = MySQL('localhost:3306', 'test', 'my_user', 'user_password')
SHOW DATABASES
┌─name─────┐
│ default │
│ mysql_db │
│ system │
└──────────┘
SHOW TABLES FROM mysql_db
┌─name─────────┐
│ mysql_table │
└──────────────┘
SELECT * FROM mysql_db.mysql_table
┌─int_id─┬─value─┐
│ 1 │ 2 │
└────────┴───────┘
INSERT INTO mysql_db.mysql_table VALUES (3,4)
SELECT * FROM mysql_db.mysql_table
┌─int_id─┬─value─┐
│ 1 │ 2 │
│ 3 │ 4 │
└────────┴───────┘

–数据库引擎

?可以使用自己的数据库引擎,可以配置可配置的表引擎,和所有支持的sql语法

?数据库引擎:MySQL

Sql语法

?create

–create database

–用于创建指定名称的数据库。语法如下:

CREATE DATABASE [IF NOT EXISTS] db_name

?若查询中存在if not exists,则当数据库已经存在时,该查询不会返回任何错误

?:) create database test;
Ok.
0 rows in set. Elapsed: 0.018 sec.

?CREATE TABLE

–CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = engine

–DEFAULT expr – 默认值,用法与SQL类似。MATERIALIZED expr – 物化表达式,被该表达式指定的列不能被INSERT,因为它总是被计算出来的。对于INSERT而言,不需要考虑这些列。另外,在SELECT查询中如果包含星号,此列不会被查询。ALIAS expr – 别名

–3种方式创建;

?直接

–:) create table t1(id UInt16,name String) engine=TinyLog

?创建一个与其他表具有相同结构的表

–CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]

–对其指定不同的表引擎声明。如果没有表引擎声明,则创建的表将与db2.name2使用相同的表引擎。

?:) create table t2 as t1 engine=Memory
:) desc t2
DESCRIBE TABLE t2
┌─name─┬─type───┬─default_type─┬─default_expression─┐
│ id │ UInt16 │ │ │
│ name │ String │ │ │
└──────┴────────┴──────────────┴────────────────────┘

?使用指定的引擎创建一个与SELECT子句的结果具有相同结构的表,并使用SELECT子句的结果填充它。

–CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE = engine AS SELECT ...

- 例子;
- ```
先在t2中插入几条数据
:) insert into t1 values(1,'zhangsan'),(2,'lisi'),(3,'wangwu')
:) create table t3 engine=TinyLog as select * from t1
:) select * from t3
┌─id─┬─name─────┐
│ 1 │ zhangsan │
│ 2 │ lisi │
│ 3 │ wangwu │
└────┴──────────┘
```


?insert into

–主要用于向表中添加数据,基本格式如下

?INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...

–实例

?:) insert into t1 values(1,'zhangsan'),(2,'lisi'),(3,'wangwu')

–使用select来写入数据

?INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...

–实例;

?:) insert into t2 select * from t3
:) select * from t2
┌─id─┬─name─────┐
│ 1 │ zhangsan │
│ 2 │ lisi │
│ 3 │ wangwu │
└────┴──────────┘

–ClickHouse不支持的修改数据的查询:UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE。

?ALTER

?ALTER只支持MergeTree系列,Merge和Distributed引擎的表,基本语法:

–ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...

?参数解析:ADD COLUMN – 向表中添加新列 DROP COLUMN – 在表中删除列 MODIFY COLUMN – 更改列的类型

?例子:

–create table mt_table (date Date, id UInt8, name String) ENGINE=MergeTree(date, (id, name), 8192);

–插入一些值

?insert into mt_table values ('2019-05-01', 1, 'zhangsan');
insert into mt_table values ('2019-06-01', 2, 'lisi');
insert into mt_table values ('2019-05-03', 3, 'wangwu');

–末尾添加一个新列age

?:)alter table mt_table add column age UInt8
:)desc mt_table
┌─name─┬─type───┬─default_type─┬─default_expression─┐
│ date │ Date │ │ │
│ id │ UInt8 │ │ │
│ name │ String │ │ │
│ age │ UInt8 │ │ │
└──────┴────────┴──────────────┴────────────────────┘
:) select * from mt_table
┌───────date─┬─id─┬─name─┬─age─┐
│ 2019-06-01 │ 2 │ lisi │ 0 │
└────────────┴────┴──────┴─────┘
┌───────date─┬─id─┬─name─────┬─age─┐
│ 2019-05-01 │ 1 │ zhangsan │ 0 │
│ 2019-05-03 │ 3 │ wangwu │ 0 │
└────────────┴────┴──────────┴─────┘

–更改age列的类型

?:)alter table mt_table modify column age UInt16
:)desc mt_table
┌─name─┬─type───┬─default_type─┬─default_expression─┐
│ date │ Date │ │ │
│ id │ UInt8 │ │ │
│ name │ String │ │ │
│ age │ UInt16 │ │ │
└──────┴────────┴──────────────┴────────────────────┘

–删除刚才创建的age列

?:)alter table mt_table drop column age
:)desc mt_table
┌─name─┬─type───┬─default_type─┬─default_expression─┐
│ date │ Date │ │ │
│ id │ UInt8 │ │ │
│ name │ String │ │ │
└──────┴────────┴──────────────┴────────────────────┘

?DESCRIBE TABLE

–查看表结构

?:)desc mt_table
┌─name─┬─type───┬─default_type─┬─default_expression─┐
│ date │ Date │ │ │
│ id │ UInt8 │ │ │
│ name │ String │ │ │
└──────┴────────┴──────────────┴────────────────────┘

?CHECK TABLE

–检查表中的数据是否损坏,他会返回两种结果:0 – 数据已损坏 1 – 数据完整 该命令只支持Log,TinyLog和StripeLog引擎。

?物化视图

–whit xxx视图名 as select 所需结果集from 表 xxx视图名 as(这就是多个物化视图)格式

–也是列

–不能select *出来

–不能insert的进去

HDFS的CSV文件

?csv也逗号分割的数据

?

?

–表在hdfs上

?hdfs导出到clickhouse的

–表在clickhouse上

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表