ClickHouse(06)ClickHouse建表语句DDL详细解析

当前服务器上创建表(单节点)

创建新表具有几种种语法形式,具体取决于用例。默认情况下,仅在当前服务器上创建表。分布式DDL查询作为子句实现,该子句另外描述。

语法形式

使用显式架构

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr1] [compression_codec] [TTL expr1],
    name2 [type2] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr2] [compression_codec] [TTL expr2],
    ...

) ENGINE = engine

使用[db_name.]参数可以为数据表指定数据库,如果不指定此参数,则默认会使用default数据库。

末尾的ENGINE参数,它被用于指定数据表的引擎。表引擎决定了数据表的特性,也决定了数据将会被如何存储及加载。例如示例中使用的Memory表引擎,是ClickHouse最简单的表引擎,数据只会被保存在内存中,在服务重启时数据会丢失。

从相同结构的表复制创建

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

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:622ebae1-1054-41c6-9cca-66ce54e168be

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:f5661354-f8ae-4a7e-a051-fa197373f9ce

从表函数创建

CREATE TABLE [IF NOT EXISTS] [db.]table_name AS table_function()

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:23384c87-2aaa-462f-b16c-ea11dbf82aba

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:4f44c659-b1c4-4614-9eb0-a6d190b92ad6

什么是表函数?简单来说就是一个可以返回一张表的函数。下面是一个表函数的例子,from后面跟着的就是一个表函数。

CREATE TABLE Orders
ENGINE = MergeTree
ORDER BY OrderID AS
SELECT *
FROM mysql('10.42.134.136:4000', 'databas', 'Orders', 'root', '1234')

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:778465f1-3d6f-49d7-87c0-e81a7416ac29

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:b15f5472-6791-447a-bb6b-7f2feccd63db

ClickHouse(06)ClickHouse建表语句DDL详细解析

从选择查询创建

CREATE TABLE [IF NOT EXISTS] [db.]table_name[(name1 [type1], name2 [type2], ...)] ENGINE = engine AS SELECT ...

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:5240acf3-d117-41fa-b1fc-3eb9670817d4

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:4032d70b-1b99-4f3d-9910-17f5a63af50b

使用IF NOT EXISTS,如果表已存在且已指定,则查询不会执行任何操作。

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:2c5b9582-2381-4393-a720-aea057067d6c

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:6e871a58-f5da-4bf4-ba77-60e367894d33

分布式集群创建表

ClickHouse支持集群模式,一个集群拥有1到多个节点。CREATE、ALTER、DROP、RENMAE及TRUNCATE这些DDL语句,都支持分布式执行。这意味着,如果在集群中任意一个节点上执行DDL语句,那么集群中的每个节点都会以相同的顺序执行相同的语句。这项特性意义非凡,它就如同批处理命令一样,省去了需要依次去单个节点执行DDL的烦恼。
将一条普通的DDL语句转换成分布式执行十分简单,只需加上ON CLUSTER cluster_name声明即可。

例如,执行下面的语句后将会对ch_cluster集群内的所有节点广播这条DDL语句:

CREATE TABLE partition_v3 ON CLUSTER ch_cluster(
    ID String,
    URL String,
    EventTime Date
) ENGINE =  MergeTree()
PARTITION BY toYYYYMM(EventTime)
ORDER BY ID

ch_cluster是集群的名称。

临时表

ClickHouse也有临时表的概念,创建临时表的方法是在普通表的基础之上添加TEMPORARY关键字,它的完整语法如下所示:

CREATE TEMPORARY TABLE [IF NOT EXISTS] table_name (
    name1 [type] [DEFAULT|MATERIALIZED|ALIAS expr],
    name2 [type] [DEFAULT|MATERIALIZED|ALIAS expr],
)

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:943852aa-d7ca-43f8-b093-31cf45fae5d7

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:82c98e92-56c3-4bac-996e-5c8de6fbaa83

  • 它的生命周期是会话绑定的,所以它只支持Memory表引擎,如果会话结束,数据表就会被销毁;
    [TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:c53f4c49-bbe4-4813-b612-b0052beaaa3e
    [En]

    [TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:0d5c2388-4b27-4dd5-be7c-2fb688544970

临时表的优先级是大于普通表的。当两张数据表名称相同的时候,会优先读取临时表的数据

分区表

数据分区(partition)和数据分片(shard)是完全不同的两个概念。数据分区是针对本地数据而言的,是数据的一种纵向切分。而数据分片是数据的一种横向切分。借助数据分区,在后续的查询过程中能够跳过不必要的数据目录,从而提升查询的性能。
不是所有的表引擎都可以使用分区,目前只有合并树(MergeTree)家族系列的表引擎才支持数据分区。由PARTITION BY指定分区键,下面的数据表partition_00使用了日期字段作为分区键,并将其格式化为年月的形式:

CREATE TABLE partition_00 (
    ID String,
    URL String,
    EventTime Date
) ENGINE =  MergeTree()
PARTITION BY toYYYYMM(EventTime)
ORDER BY ID

创建表语句关键字解析

空值或非空修饰符

列定义中数据类型后面的修饰符可以指定允许或不允许其值为Null。

CREATE TABLE Orders
(

    order_id String,
    created_at Nullable(DateTime),
    updated_at Nullable(DateTime)
)
ENGINE = MergeTree
ORDER BY (order_id)
SETTINGS index_granularity = 8192

上面的例子中created_at和updated_at可以插入一个NULL值,反之不可以。

默认值表达式

[DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr1]

表字段支持四种默认值表达式的定义方法,分别是DEFAULT、MATERIALIZED、EPHEMERAL和ALIAS。无论使用哪种形式,表字段一旦被定义了默认值,它便不再强制要求定义数据类型,因为ClickHouse会根据默认值进行类型推断。

例:URLDomain String DEFAULT domain(URL)

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:c2aac8f3-0eb4-4f0a-80de-cbd9488cf7db

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:13b5e751-a5c8-4619-b80e-af8f8911a316

  1. 数据写入:在数据写入时,只有DEFAULT类型的字段可以出现在INSERT语句中。而MATERIALIZED、EPHEMERAL和ALIAS都不能被显式赋值,它们只能依靠计算取值。例如试图为MATERIALIZED类型的字段写入数据,将会得到如下的错误。
    DB::Exception: Cannot insert column URL, because it is MATERIALIZED column..

  2. 数据查询:在数据查询时,只有DEFAULT类型的字段可以通过SELECT 返回。而MATERIALIZED、EPHEMERAL和ALIAS类型的字段不会出现在SELECT 查询的返回结果集中。

  3. 数据存储:在数据存储时,只有DEFAULT和MATERIALIZED类型的字段才支持持久化。如果使用的表引擎支持物理存储(例如TinyLog表引擎),那么这些列字段将会拥有物理存储。而ALIAS、EPHEMERAL类型的字段不支持持久化,它的取值总是需要依靠计算产生,数据不会落到磁盘。
  4. EPHEMERAL只能在CREATE语句的默认值中引用。

怎么理解这四种表达式呢?它其实就是列值的四种生成方式。DEFAULT是在插入的时候计算填充,MATERIALIZED和ALIAS是在查询的时候,或者说用到的时候填充,而EPHEMERAL,有点类似于我们在建表的时候,创建一个变量,一个代码块。

一般表达式

DEFAULT expr

正常默认值。如果INSERT查询未指定相应的列,则将通过计算相应的表达式来填充它。

物化表达式

MATERIALIZED expr

物化字段列。这样的字段不能在INSERT语句中指定值插入,因为这样的字段总是通过使用其他字段计算出来的。

临时表达式

EPHEMERAL expr

临时字段列。这样的列不存储在表中,不能被SELECT 查询,但可以在CREATE语句的默认值中引用。

别名表达式

ALIAS expr

字段别名。这样的列根本不存储在表中。其值不能插入到表中,并且在通过SELECT * 查询,不会出现在结果集。如果在查询分析期间扩展了别名,则可以在SELECT中使用它。

主键

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:d0c51f89-2ac7-45a4-9de4-8200000df0ec

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:034a4dde-167a-4470-98bd-fa1f10252e95

-- 内部定义
CREATE TABLE db.table_name
(
    name1 type1, name2 type2, ...,
    PRIMARY KEY(expr1[, expr2,...])]
)
ENGINE = engine;

-- 外部定义
CREATE TABLE db.table_name
(
    name1 type1, name2 type2, ...

)
ENGINE = engine
PRIMARY KEY(expr1[, expr2,...]);

警告:不能在一个查询中以两种方式组合。

约束

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [compression_codec] [TTL expr1],
    ...

    CONSTRAINT constraint_name_1 CHECK boolean_expr_1,
    ...

) ENGINE = engine

boolean_expr_1可以通过任何布尔表达式。如果为表定义了约束,则将针对查询中的每一行检查每个约束。如果不满足任何约束,服务器将引发包含约束名称和检查表达式的异常。INSERT添加大量约束可能会对大型查询的性能产生负面影响。

数据TTL

TTL即Time To Live,表达式正常为:TTL expr1。只能为合并树族表指定。

它表示数据的存活时间。在MergeTree中,可以为某个列字段或整张表设置TTL。当时间到达时,如果是列字段级别的TTL,则会删除这一列的数据;如果是表级别的TTL,则会删除整张表的数据;如果同时设置了列级别和表级别的TTL,则会以先到期的那个为主。

无论是列级别还是表级别的TTL,都需要依托某个DateTime或Date类型的字段,通过对这个时间字段的INTERVAL操作,来表述TTL的过期时间。

如下面的例子。

-- 表示数据的存活时间是time_col时间的3天之后。
TTL time_col + INTERVAL 3 DAY 上述

-- 表示数据的存活时间是time_col时间的1月之后
TTL time_col + INTERVAL 1 MONTH。

-- INTERVAL完整的操作包括SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER和YEAR。

列级别TTL

CREATE TABLE ttl_table_v1(
    id String,
    create_time DateTime,
    code String TTL create_time + INTERVAL 10 SECOND,
    type UInt8 TTL create_time + INTERVAL 10 SECOND
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(create_time)
ORDER BY id

表级别TTL

CREATE TABLE ttl_table_v2(
    id String,
    create_time DateTime,
    code String TTL create_time + INTERVAL 1 MINUTE,
    type UInt8
)ENGINE = MergeTree
PARTITION BY toYYYYMM(create_time)
ORDER BY create_time
TTL create_time + INTERVAL 1 DAY

clickhouse压缩与编码

列压缩

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:64888310-0ede-4c58-a7f4-1d674221122e

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:59534cb7-e033-4ed7-a18d-c44684c7f884

CREATE TABLE codec_example
(
    dt Date CODEC(ZSTD),
    ts DateTime CODEC(LZ4HC),
    float_value Float32 CODEC(NONE),
    double_value Float64 CODEC(LZ4HC(9)),
    value Float32 CODEC(Delta, ZSTD)
)
ENGINE =
...

下表引擎支持压缩:

  • MergeTree family:支持列压缩编解码器,并通过压缩设置选择默认压缩方法。
  • Log family:默认情况下使用压缩方法,并支持列压缩编解码器lz4。
  • Set:仅支持默认压缩。
  • Join:仅支持默认压缩。

目前clickhouse支持的压缩算法

  1. 通用编码

  2. None:无压缩

  3. LZ4:默认的压缩算法,缺省值也是使用默认的压缩算法
  4. LZ4HC[(level)]:z4高压缩率压缩算法版本, level默认值为9,支持[112],推荐选用[49]
  5. ZSTD[(level)]:zstd压缩算法,level默认值为1,支持[1~22]

  6. 特殊编码

  7. LowCardinality:枚举值小于1w的字符串

  8. Delta:时间序列类型的数据,不会对数据进行压缩
  9. T64:比较适合Int类型数据
  10. DoubleDelta:适用缓慢变化的序列:比如时间序列,对于递增序列效果很好
  11. Gorilla:使用缓慢变化的数值类型

特殊编码与通用的压缩算法相比,区别在于,通用的LZ4和ZSTD压缩算法是普适行的,不关心数据的分布特点,而特殊编码类型对于特定场景下的数据会有更好的压缩效果。

ClickHouse相关资料分享

ClickHouse经典中文文档分享

参考文章

ClickHouse(06)ClickHouse的数据表创建语句详细解析

Original: https://www.cnblogs.com/the-pig-of-zf/p/16708795.html
Author: 张飞的猪
Title: ClickHouse(06)ClickHouse建表语句DDL详细解析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/561891/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 大数据Hive(一):​​​​​​​Hive基本概念

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    大数据 2023年11月12日
    052
  • redis缓存失效问题

    大数据 2023年11月15日
    039
  • Hadoop2.x与Hadoop3.x副本选择机制

    HDFS 上的文件对应的 Block 保存多个副本,且提供容错机制,副本丢失或者宕机自动恢复,默认是存 3 个副本。 2.8.x之前的副本策略 官方文档说明: https://ha…

    大数据 2023年5月26日
    089
  • 数学之美读书日记

    判断句子是否合乎语法 判断一个句子是否符合人们的习惯(合乎人们的说话习惯)只需要计算出该句子出现的概率就行 假设有一句话为 $ S=w_1w_2w_3…w_n(n=le…

    大数据 2023年5月28日
    061
  • sql基础

    关系型数据库是由多张能互相联接的二维行列表格组成的数据库主关键字(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录外键表示了两个关系之间的相关联…

    大数据 2023年11月11日
    043
  • Hive和Spark分区策略

    1.概述 离线数据处理生态系统包含许多关键任务,最大限度的提高数据管道基础设施的稳定性和效率是至关重要的。这边博客将分享Hive和Spark分区的各种策略,以最大限度的提高数据工程…

    大数据 2023年6月3日
    071
  • 【云原生】Prometheus+Grafana on K8s 环境部署

    一、概述 二、使用 Helm 安装 Prometheus 1)配置源 2)下载 prometheus 包 3)修改镜像 4)安装 prometheus 5)访问web 6)配置ht…

    大数据 2023年6月3日
    0123
  • Hive Beeline

    Beeline 要与 HiveServer2 配合使用HiveServer2(HS2)是一种使客户端能够对 Hive 执行查询的服务。HiveServer2 是已被废弃的 Hive…

    大数据 2023年5月25日
    065
  • HIve数仓新零售项目DWS层的构建(Grouping sets)模型

    HIve数仓新零售项目 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,C…

    大数据 2023年11月12日
    065
  • podman的部署和应用

    podman的部署和应用 podman的部署和应用 什么是Podman 什么是Docker Podman的使用与Docker有什么区别 部署Podman Podman的应用 cop…

    大数据 2023年5月27日
    086
  • iphone各版本分辨率

    机型的大小和像素【iphoneX 、iphoneXS、iphoneXSMax、iphoneXR】 手机型号开发尺寸像素命名Device pixel ratioiPhone XS M…

    大数据 2023年11月11日
    032
  • 剑指Offer:斐波那契数列(10.1)

    题目描述: 求斐波那契数列的第 n 项,n 解题思路: 如果使用递归求解,会重复计算一些子问题。例如,计算 f(4) 需要计算 f(3) 和 f(2),计算 f(3) 需要计算 f…

    大数据 2023年6月3日
    066
  • 【大数据】Hadoop在呼唤Hive(附一键部署Hive脚本)

    CSDN话题挑战赛第2期参赛话题:学习笔记 一、准备工作 1、下载Hive包 Hive下载地址本文以apache-hive-3.1.2-bin.tar.gz作为部署,可以自身需要选…

    大数据 2023年11月12日
    063
  • JVM优化之 -Xss -Xms -Xmx -Xmn 参数设置

    Xmn Xms Xmx Xss有什么区别?Xmn、Xms、Xmx、Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果。 -Xms 堆内存…

    大数据 2023年5月28日
    0211
  • hivesql中 exists 用法

    有一次面试的时候,面试官问了这么一个场景题:一家门店一个月内每位顾客访问的目的可能有多种,并给到访顾客的目的打标签1、2、3、4这四类,现在要统计这家门店一个月内没有3、4标签的顾…

    大数据 2023年11月12日
    038
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球