• 第三章 数据定义


    一、ClickHouse的数据类型

    1.1 基础类型

            ClickHouse的基础类型只有数值、字符串和时间三种类型。

    1.1.1 数值类型

            1)Int 

    分类名称大小(字节)范围java
    有符号整数类型Int81-(2^7)到2^7-1byte
    Int162-(2^15)到2^15-1short
    Int324-(2^31)到2^31-1int
    Int648-(2^63)到2^63-1long
    无符号整数类型UInt812^8-
    UInt1622^16-
    UInt3242^32-
    UInt6482^64-

            2)Float 

    名称大小(字节)精度java
    Float3247float
    Float64816double

            3)Decimal

            在使用Float浮点数进行运算时,精度是有限的, 如果写入超过了有效精度的数值,则会出现数据误差,因此此时需要使用定点数。原生声明方式为Decimal(P, S)

    • P代表精度,决定总位数(整数部分+小数部分),取值范围是1~38
    • S决定小数位数,取值范围是0~P

            有三种简写方式:

    简写等效声明范围
    Decimal32(S)Decimal(1~9, S)-(10^(9-S))到10^(9-S)
    Decimal64(S)Decimal(10~18, S)-(10^(18-S))到10^(18-S)
    Decimal128(S)Decimal(19~38, S)-(10^(38-S))到10^(38-S)

    1.1.2 字符串类型

    1)String

    特点:

    • 无须声明大小
    • 代替传统数据库的varchar、Text、Clob和Blob
    • 不限制字符集

    2)FixedString

            类似传统数据库的char类型,如果字符串实际长度不满足限制长度,在末尾用空字符串填充

    3)UUID

            格式为8-4-4-4-12的字符串,如果在写入时未赋值,则依照格式用0填充

     1.1.3 时间类型

    类型精度
    DateTime
    DateTime64亚秒
    Date日期

    1.2 复合类型

    复合类型有四种:数组、元组、枚举、嵌套。

    1)Array 声明方式有两种,如下:

    1. SELECT array(1,2) as aa, toTypeName(aa);
    2. SELECT [1,2] AS aa, toTypeName(aa);
    3. -- DDL定义
    4. CREATE TABLE ARRAY_TEST( \
    5. C1 Array(String) \
    6. ) engine = Memory;

    2)Tuple,元组是由多个元素组成的一个数据集,多个元素的类型可以不同,声明方式如下:

    1. SELECT tuple(1, 'a', now()) AS aa, toTypeName(aa);
    2. SELECT (1, 2.01, null) as aa, toTypeName(aa);
    3. -- DDL定义
    4. CREATE TABLE TUPLE_TEST( \
    5. C1 Tuple(String, Int8) \
    6. ) engine = Memory;

    3)Enum,枚举类型即键值对,提供了Enum8和Enum16两种枚举类型,声明方式如下:

    1. -- DDL定义
    2. CREATE TABLE ENUM_TEST( \
    3. C1 Enum8('ready'=1, 'start'=2, 'success'=3, 'error'=4) \
    4. ) engine = Memory;
    5. INSERT INTO ENUM_TEST values ('ready');
    6. INSERT INTO ENUM_TEST values ('start');
    7. SELECT * FROM ENUM_TEST WHERE C1=1;
    8. SELECT * FROM ENUM_TEST WHERE C1='start';

    枚举固定使用Key->Int(String -> Int)进行定义,定义的Key是String类型,但是在对其进行操作时,会使用Int类型的Value进行操作。

    4)Nested,嵌套类型,特点:

    • 可以理解为在表中嵌套一个表
    • 不能多层嵌套
    • 使用数组进行插入
    1. -- DDL
    2. CREATE TABLE NESTED_TEST( \
    3. name String, \
    4. age UInt8, \
    5. dept Nested( \
    6. id UInt16, \
    7. name String \
    8. ) \
    9. ) ENGINE = Memory;
    10. INSERT INTO NESTED_TEST VALUES ('nauu', 18, [1000], ['测试中心']);
    11. INSERT INTO NESTED_TEST VALUES ('amy', 18, [1000, 1001], ['测试中心', '研发中心']);
    12. select name, age, dept.id from NESTED_TEST;

    1.3 特殊类型

    类型说明
    NullableNull值的声明
    IPv4通过UInt32存储IPv4,并且自动进行数据校验
    IPv6通过FixedString(16)存储IPv6,自动进行校验

    二、如何定义数据表

    2.1 数据库

    CREATE DATABASE IF NOT EXISTS DB_NAME [ENGINE = engine]

    数据库支持设置引擎,目前支持5中引擎:

    1. Ordinary:默认引擎,此数据库下的表可以使用任意引擎。
    2. Dictionary:字典引擎,此类数据库会自动为所有数据字典创建它们的数据表。
    3. Memory:内存引擎,用于存放临时数据,数据只会停留在内存中,不会涉及任何磁盘操作,当服务重启后数据会被清除。
    4. Lazy:日志引擎,只能使用Log系列的表引擎。
    5. MySQL:MySQL引擎,此类数据库会自动拉取远端MySQL的数据。

    2.2 临时表

    1. CREATE TEMPORARY TABLE [IF NOT EXISTS] TABLE_NAME (
    2. NAME1 [TYPE],
    3. NAME2 [TYPE],
    4. )

    特点:

    1. 生命周期与会话一致,只支持Memory引擎,会话结束,则数据表被销毁;
    2. 临时表不属于任何数据库,创建时,不需要指定数据库参数和表引擎参数。 

    2.3 分区表

            数据分区是针对本地数据的纵向切分,借助数据分区,可以在查询时跳过不必要的数据目录,从而提升性能。数据分区不宜粒度太细,会使得分区数量急剧增长,从而导致性能下降。

            创建分区表语法:

    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;
    8. -- 插入数据
    9. INSERT INTO partition_v1 VALUES \
    10. ('A000', 'www.baidu.com', '2019-05-01'), \
    11. ('A001', 'www.qq.com', '2019-06-02');
    12. -- 查询分区状态
    13. SELECT table, partition, path from system.parts WHERE table = 'partition_v1';

    2.4 视图

            ClickHouse类似Oracle有普通和物化两种视图,物化视图拥有独立的存储。

            创建物化视图语法:

    CREATE [MATERIALIZED] VIEW  [IF NOT EXISTS] [DB.]TABLE_NAME [TO [DB.]NAME] [ENGINE=engine] [POPULATE] AS SELECT * FROM ...

            ClickHouse物化视图特点: 

    1. 源表被写入新数据后,物化视图也会同步更新;
    2. POPULATE修饰的物化视图,会在创建视图时,初始化数据到视图中,如果未加该修饰,则创建时,无数据,后续写入才会有数据;   
    3. 物化视图中的数据目前还不支持同步删除,即表中数据被删除了,物化视图中的数据依然存在。    

    三、数据分区的基本操作

    3.1 查询分区信息

    select partition_id,name,table, database from system.parts where table = 'partition_v1';

             如上图,partition_v1表共有2个分区,其中partition_id和name可以作为分区信息的联合主键。

    3.2 删除指定分区

    1. alter table partition_v1 drop partition 201905;
    2. select partition_id,name,table, database from system.parts where table = 'partition_v1';

            如上图,删除分区后,通过sql查询分区信息,已经不能查到被删除的分区,同时数据目录中也没有对应的分区目录。 

    3.3 分区数据操作

    1. -- 复制分区数据
    2. alter table partition_v2 replace partition 201908 from partition_v1;
    3. -- 重置分区数据,清空URL列
    4. alter table partition_v2 clear column URL in partition 201908;

    复制分区数据条件:

    1.  两张表拥有相同的分区键;
    2. 表结构相同。

     复制分区数据场景:

            复制分区数据可以用于快速数据写入,多表建数据同步和备份。则可以用于如历史数据迁移之类的场景。

    3.4 卸载与装载分区

    1. -- 卸载分区
    2. alter table partition_v1 detach partition 201906;
    3. -- 装载分区
    4. alter table partition_v1 attach partition 201906;

            装载分区和卸载分区是一对伴生操作。

            卸载分区,会将物理数据转移到数据表目录的detached子目录下,而装载分区是其反向操作。一旦分区被移动到detached ,则脱离了ClickHouse的管理,但是数据文件会一直存在。

  • 相关阅读:
    计算机毕设 LSTM的预测算法 - 股票预测 天气预测 房价预测
    Java环境搭建、IDEA、Java语言
    减法聚类(Subtractive Clustering)算法实践
    jQuery基础----常用的选择器
    在腾讯云服务器的Centos上从零开始部署并运行TinyWebServer服务器,过程记录(非常详细)
    2022-09-02 mysql-in函数官方说明记录
    Flowable工作流实战
    2015架构真题(五十)
    栈的运行算法
    docker创建自定义网络
  • 原文地址:https://blog.csdn.net/u014051010/article/details/126348599