当前位置: 首页 >> ClickHouse >> 数据定义

数据定义

2020-10-07 15:17:50 星期三  阅读:6580


数据类型

基本类型 复合类型
数值 数组
字符串 元组(Tuple)
时间 枚举
嵌套(Nested)

特殊类型
Nullable:经过Nullable修饰的字段可以被写入null值(尽量便面使用Nullable类型,会降低查询性能)
Domain:域名类型(其实就是基于整型和字符串的进一步封装)

创建数据库

创建语句

CREATE DATABASE IF NOT EXISTS db_name [ENGINE = engine]

数据库支持的引擎

Ordinary:默认引擎,在绝大多数情况下我们都会使用默认引擎,使用时无须刻意声明。在此数据库下可以使用任意类型的表引擎。

Dictionary:字典引擎,此类数据库会自动为所有数据字典创建它们的数据表,关于数据字典的详细介绍会在第5章展开。

Memory:内存引擎,用于存放临时数据。此类数据库下的数据表只会停留在内存中,不会涉及任何磁盘操作,当服务重启后数据会被清除。

Lazy:日志引擎,此类数据库下只能使用Log系列的表引擎,关于Log表引擎的详细介绍会在第8章展开。

MySQL:MySQL引擎,此类数据库下会自动拉取远端MySQL中的数据,并为它们创建MySQL表引擎的数据表,关于MySQL表引擎的详细介绍会在第8章展开。
实际上一个数据库对应的是底层操作系统的一个文件目录。

创建表

clickhouse提供了三种创建表的方法
常规定义法

  1. CREATE TABLE [IF NOT EXISTS] [db_name.]table_name (
  2. name1 [type] [DEFAULT|MATERIALIZED|ALIAS expr],
  3. name2 [type] [DEFAULT|MATERIALIZED|ALIAS expr],
  4. 省略…
  5. ) ENGINE = engine

复制其他表结构

  1. CREATE TABLE [IF NOT EXISTS] [db_name.]table_name as [dbname.]table_name2 [ENGINE=engine]

通过select方式创建,这种方式会将表结构和数据都复制到新表

  1. CREATE TABLE [IF NOT EXISTS] [db_name.]table_name ENGINE = engine AS SELECT

表的类型

临时表
创建普通表时增加TEMPORARY关键字,临时表不属于任何数据库,如果同时查询临时表和普通表,会优先读取临时表的数据

分区表
只有合并数(MergeTree)家族系列的表引擎才支持创建分区表

  1. CREATE TABLE partition_v1 (
  2. ID String,
  3. URL String,
  4. EventTime Date
  5. ) ENGINE = MergeTree()
  6. PARTITION BY toYYYYMM(EventTime)
  7. ORDER BY ID

视图
视图又分为普通视图和物化视图两种
普通视图不会存储任何数据,只是单纯的将select查询映射,物化视图则相反,且支持表引擎

表操作

其他操作类型(增加列、删除列、增加备注等)都跟hive和MySQL大同小异,这里记录一个比较特殊的操作

移动数据表——RENAME关键字
不仅可以重命名表名,还可以移动表的位置(比如从A库移动到B库)如果移动前后两个库的库名相同,则相当于表重命名,类似于Linux mv命令的作用
RENAME TABLE db1.table1 TO db2.table2

分区的卸载与装载

分区被卸载后,它的物理数据并没有删除,而是被转移到了当前数据表目录的detached子目录下。而装载分区则是反向操作,它能够将detached子目录下的某个分区重新装载回去。
一旦分区被移动到了detached子目录,就代表它已经脱离了ClickHouse的管理,ClickHouse并不会主动清理这些文件。

分布式DDL执行

将一条普通的DDL语句转换成分布式执行十分简单,只需加上ON CLUSTER cluster_name声明即可。该声明可以对集群内的所有节点广播这条DDL语句

  1. CREATE TABLE partition_v3 ON CLUSTER ch_cluster(
  2. ID String,
  3. URL String,
  4. EventTime Date
  5. ) ENGINE = MergeTree()
  6. PARTITION BY toYYYYMM(EventTime)
  7. ORDER BY I

数据的删除与修改

行级别删除与更新时很“重”的操作(把原来的数据复制一份到新的数据目录,删除和更新后,再把原来的数据目录下线,使用新的数据目录),因此更适用于批量数据的修改和删除。其次不支持事务,也就是说,如果更新失败,则不会回滚。

  1. # 删除数据
  2. ALTER TABLE db_name.table_name DELETE WHERE filter_expr;
  3. # 更新数据
  4. ALTER TABLE db_name.table_name UPDATE url="xxx", os="bbb" WHERE id in(1,2,3);