clickhouse学习笔记(二)数据类型

目录

一、基础数据类型

1、整数类型

2、浮点数类型

3、布尔类型

4、字符串和固定字符串

5、日期和时间类型

6、创建基础数据类型的建表语句及插入语句

二、复合数据类型

1、数组

2、元组

3、枚举类型

4、嵌套数据结构

5、Map

三、特殊数据类型

1、低基数编码(LowCardinality)

2、Nullable

3、Decimal

4、创建包含LowCardinality,Nullable,Decimal类型的建表语句及插入语句

​编辑

解释

注意

四、性能优化的数据类型


clickhouse的数据类型分为:基础类型,复合类型,特殊类型

一、基础数据类型

1、整数类型

ClickHouse支持多种整数类型,包括有符号和无符号整数。这些类型包括:

  • UInt8UInt16UInt32UInt64:无符号整数。
  • Int8Int16Int32Int64:有符号整数。
名称     字节范围    类型对应
Int8    1 -128 ~ 127 byte
Int16    2-32768 ~ 32767 short
Int32    4-2147483648 ~ 2147483647 int
Int64    8 -9223372036854775808 ~ 9223372036854775807 bigint
UInt8    10 ~ 255   Unsigned byte
UInt16    2 0 ~ 65535  Unsigned short
UInt32    4 0 ~ 4294967295Unsigned int
UInt64    8 0 ~ 18446744073709551615 Unsigned bigint

整数类型的选择取决于数据的范围和存储需求。

2、浮点数类型

ClickHouse提供了两种浮点数类型:

  • Float32:单精度浮点数。
  • Float64:双精度浮点数。
名称字节小数点有效位数类型对应
Float3247float
Float64816double

这些类型适用于存储浮点数数据。

3、布尔类型

  • Bool:布尔类型,可以存储0(假)或1(真)。

4、字符串和固定字符串

  • String:可变长度的字符串。
  • FixedString(N):固定长度的字符串,N是字符串的长度,长度超过N,会报错;长度不足N, 用null字节填充末尾
  • UUID:唯一值,32位,格式位8-4-4-4-12,默认都是0填充。例如:e50157b5-c809-411f-bb8d-3870ffa883bb

固定字符串类型可以提高查询性能,因为它们在内存中占用固定空间。

5、日期和时间类型

  • Date:日期,格式为YYYY-MM-DD
  • DateTime:日期和时间,格式为YYYY-MM-DD hh:mm:ss
  • DateTime64:具有时间精度的日期和时间。

DateTime类型支持时区,而DateTime64则支持更细粒度的时间精度。

6、创建基础数据类型的建表语句及插入语句

CREATE TABLE mixed_data_types (
    id UInt64,
    float_value Float64,
    is_active Bool,
    description String,
    code FixedString(10),
    created_date Date,
    updated_time DateTime
) ENGINE = MergeTree()
ORDER BY id;

#插入语句
INSERT INTO mixed_data_types (id, float_value, is_active, description, code, created_date, updated_time)
VALUES
(1, 123.456, true, 'Sample description', 'ABC123456', '2023-01-01', '2023-01-01 12:00:00');

解释各字段类型:
id UInt64 - 这是一个64位无符号整数类型,用于存储唯一的标识符或ID。

float_value Float64 - 这是一个64位浮点数类型,用于存储需要高精度的小数点数值。

is_active Bool - 这是一个布尔类型字段,用于存储逻辑值(真或假)。在ClickHouse中,布尔值实际上是以8位整数形式存储的,其中0表示False,非零值表示True。

description String - 这是一个变长字符串类型,用于存储描述性的文本数据,如备注或说明。

code FixedString(10) - 这是一个固定长度字符串类型,长度为10个字符。这种类型适合存储固定长度的代码或标识符,如产品代码或邮编。

created_date Date - 这是一个日期类型,用于存储日期信息,格式为YYYY-MM-DD。

updated_time DateTime - 这是一个日期时间类型,用于存储日期和时间信息,格式为YYYY-MM-DD HH:MM:SS。

二、复合数据类型

1、数组

ClickHouse支持数组类型,格式为Array(T),其中T是数组中的元素类型。

数组的定义
[1,2,3,4.5]
array('a','b','c')
[1,2,3,'hello'] --错误,数据类型不一致

create table test_array(
id Int8,
hobby Array(String)
)engine=Memory;
insert into test_array values(1,['eat','drink','la','sa']),(2,array('sleep','play'));
select * from test_array;
┌─id─┬─hobby─────────────────────┐
│  1 │ ['eat','drink','la','sa'] │
│  2 │ ['sleep','play']          │
└────┴───────────────────────────┘

select id,hobby,toTypeName(hobby) from test_array;
┌─id─┬─hobby─────────────────────┬─toTypeName(hobby)─┐
│  1 │ ['eat','drink','la','sa'] │ Array(String)     │
│  2 │ ['sleep','play']          │ Array(String)     │
└────┴───────────────────────────┴───────────────────┘

select id,hobby[1],toTypeName(hobby) from test_array;   --数组的取值 [index] index范围:1-based
┌─id─┬─arrayElement(hobby, 1)─┬─toTypeName(hobby)─┐
│  1 │ eat                    │ Array(String)     │
│  2 │ sleep                  │ Array(String)     │
└────┴────────────────────────┴───────────────────┘

2、元组

元组类型允许将多个不同类型的列组合在一起,格式为Tuple(T1, T2, ..., Tn)

select (1,2,'s',5.6) as x ,toTypeName(x);
┌─x─────────────┬─toTypeName((1, 2, 's', 5.6))─────────┐
│ (1,2,'s',5.6) │ Tuple(UInt8, UInt8, String, Float64) │
└───────────────┴──────────────────────────────────────┘

create table test_tuple(
c1 Tuple(UInt8,String,Float64)
)engine=Memory;

insert into test_tuple values((12,'ads',12.132)),(tuple(34,'fre',34.2)); 
select * from test_tuple;
┌─c1────────────────┐
│ (12,'ads',12.132) │
│ (34,'fre',34.2)   │
└───────────────────┘

3、枚举类型

枚举类型用于存储有限数量的值,格式为Enum('value1' = num1, 'value2' = num2, ...)

create table test_enum(
id Int8,
color Enum('RED'=1,'GREEN'=2,'BLUE'=3)
)engine=Memory;

insert into test_enum values(1,'RED');
insert into test_enum values(2,2);
select * from test_enum;
┌─id─┬─color─┐
│  1 │ RED   │
└────┴───────┘
┌─id─┬─color─┐
│  2 │ GREEN │
└────┴───────┘

4、嵌套数据结构

嵌套数据结构允许创建复杂的数据结构,格式为Nested(Name Type, Name Type, ...)

create table test_nested(
id Int8,
name String,
scores Nested(    
times UInt8,    
maths Float64,    
chinese Float64,    
english Float64    )
)engine=Memory;
desc test_nested;
┌─name───────────┬─type───────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ id             │ Int8           │              │                    │         │                  │                │
│ name           │ String         │              │                    │         │                  │                │
│ scores.times   │ Array(UInt8)   │              │                    │         │                  │                │
│ scores.maths   │ Array(Float64) │              │                    │         │                  │                │
│ scores.chinese │ Array(Float64) │              │                    │         │                  │                │
│ scores.english │ Array(Float64) │              │                    │         │                  │                │
└────────────────┴────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘

insert into test_nested values(1,'wyb',[1,2,3],[11,12,13],[14,15,16],[17,18,19]);
insert into test_nested values(2,'lyf',[1,2,],[21,22],[23,16],[25,19]);
select * from test_nested;
┌─id─┬─name─┬─scores.times─┬─scores.maths─┬─scores.chinese─┬─scores.english─┐
│  1 │ wyb  │ [1,2,3]      │ [11,12,13]   │ [14,15,16]     │ [17,18,19]     │
└────┴──────┴──────────────┴──────────────┴────────────────┴────────────────┘
┌─id─┬─name─┬─scores.times─┬─scores.maths─┬─scores.chinese─┬─scores.english─┐
│  2 │ lyf  │ [1,2]        │ [21,22]      │ [23,16]        │ [25,19]        │
└────┴──────┴──────────────┴──────────────┴────────────────┴────────────────┘

select name,scores.maths from test_nested where id=1;
┌─name─┬─scores.maths─┐
│ wyb  │ [11,12,13]   │
└──────┴──────────────┘

5、Map

Map类型的一般语法如下:

Map(K, V)Map(K,V)

其中:

  • K 是键的类型。
  • V 是值的类型。

键和值可以是ClickHouse支持的任何数据类型。

create table test_map (
a Map(String,Int8)
)engine=Memory;


insert into test_map values(map('key1',1,'key2',10,'key3',2,'key4',20));
select a['key2'] from test_map;
┌─arrayElement(a,'key2')──┐
│                      10 │
└─────────────────────────┘

三、特殊数据类型

1、低基数编码(LowCardinality)

LowCardinality(T)类型允许存储大量重复值的列,而只使用少量的内存。

2、Nullable

Nullable(T)类型允许存储NULL值,其中T是基本数据类型。

3、Decimal

Decimal(P, S)类型用于存储固定精度的小数,其中P是精度,S是小数位数。

4、创建包含LowCardinality,Nullable,Decimal类型的建表语句及插入语句

CREATE TABLE product_sales (
    product_id UInt64,
    category LowCardinality(String),
    price Decimal(10, 2),
    supplier Nullable(String),
    sale_date Date
) ENGINE = MergeTree()
ORDER BY (product_id, sale_date);



INSERT INTO product_sales (product_id, category, price, supplier, sale_date)
VALUES
(1, 'Electronics', 123.45, 'Tech Supplier Inc.', '2023-01-01'),
(2, 'Clothing', 99.99, NULL, '2023-01-02'),
(3, 'Books', 15.99, 'Bookstore Ltd.', '2023-01-03');

select * from product_sales

解释


category LowCardinality(String):LowCardinality类型用于优化那些具有相对较少不同值的列(即低基数),它可以显著减少存储空间和加快查询速度。这里的category字段用于存储产品类别。

price Decimal(10, 2):Decimal类型用于存储固定精度的小数,这里Decimal(10, 2)表示总位数为10位,其中小数点后有2位。适合存储商品价格这类需要精确到几分钱的数值。

supplier Nullable(String):Nullable类型允许字段值为NULL,这对于处理可能缺失的数据非常有用。在这里,supplier字段可能没有值,因此使用了Nullable类型。

注意
  • 当使用Nullable类型插入数据时,如果字段值未知或不适用,可以使用NULL来表示。

  • Decimal类型的值在插入时应准确匹配定义的精度,否则可能会导致错误。

四、性能优化的数据类型

ClickHouse的数据类型设计考虑了性能优化,例如:

  • 使用UInt类型代替Int类型,因为正数比负数更常见,这可以减少存储需求。
  • 使用LowCardinality类型来减少重复值的存储。
  • 使用Nullable类型来存储可能包含NULL值的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/678585.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SwiftUI 利用 Swizz 黑魔法为系统创建的默认对象插入新协议方法(一)

功能需求 在 SwiftUI 的开发中,我们往往需要借助底层 UIKit 的“上帝之手”来进一步实现额外的定制功能。比如,在可拖放(Dragable)SwiftUI 的实现中,会缺失一些关键的回调方法让我们这些秃头码农们“欲哭无泪” 如上图所示,我们在拖放取消时将界面中的一切改变都恢复如初…

【调试笔记-20240604-Linux-为 OpenWrt-23.05 添加自己的 feed 软件包】

调试笔记-系列文章目录 调试笔记-20240604-Linux-为 OpenWrt-23.05 添加自己的 feed 软件包 文章目录 调试笔记-系列文章目录调试笔记-20240604-Linux-为 OpenWrt-23.05 添加自己的 feed 软件包 前言一、调试环境操作系统:Ubuntu 22.04.4 LTS编译环境调试目标 二、…

《python》poetry install下载缓慢,网络问题断开连接--poetry换源镜像下载+国内镜像

在使用打包工具poetry进行打包的是出现了一个问题就是,在使用poetry进行打包的时候出现了,连接断开这样的问题,这个问题是可以通过换源,通过国内的镜像来解决这个问题就可以了。 找到项目中的pyoroject。toml文件这个文件中写了一…

ESP8266 01sWiFi模块保姆级教程 烧录和联网,连接华为云

前言 写在前面。 这个esp01s联网真的是折磨人啊,浪费了我三四天的时间,网上各种教程叫天天不灵,叫地地不灵,所以才有了这篇教程,致力于帮助像我一样的小白少踩坑,我可以说是把能踩的坑都塌了一遍。 烧录…

Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制

多环境开发(yaml文件版) 我们在自己的开发中是自己环境 测试 生产的环境都不同 多环境分为 两个步骤 设置环境 生产环境 开发环境 测试环境 手搓三个环境 设置应用环境 应用pro配置 # 应用环境 spring:profiles:active: pro--- # 设置环境 # 生产环境 spring:profiles: p…

MySQL 存储过程(一)

本篇主要介绍MySQL存储过程的相关内容 目录 一、什么是存储过程? 二、基本语法 创建存储过程 调用存储过程 查看存储过程 删除存储过程 三、变量 系统变量 用户自定义变量 局部变量 四、存储过程的参数 in out inout 一、什么是存储过程&#xff1f…

No module named _sqlite3解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

RedHat9 | 控制启动过程

1、Linux系统启动引导流程 加电自检(POST)寻找启动顺序(BIOS/UEFI)读取启动加载程序(MBR->Bootloader)加载内核与内存文件系统(kernel-initramfs)加载硬件及驱动(/lib/modules或/lib64/modules)初始化系…

9 -力扣高频 SQL 50 题(基础版)

9 - 上升的温度 -- 找出与之前(昨天的)日期相比温度更高的所有日期的 id -- DATEDIFF(2007-12-31,2007-12-30); # 1 -- DATEDIFF(2010-12-30,2010-12-31); # -1select w1.id from Weather w1, Weather w2 wheredatediff(w1.recordDate,w2.recordDat…

数组的详细介绍

数组是一组相同类型元素的集合,也就是说:数组至少包含两个及以上的元素,且元素类型相同。 数组包括一维数组和多维数组,其中二维数组最常见。下面我们一一介绍。 一维数组: 格式:type name [常量值]&…

微信短视频怎么收藏?成都鼎茂宏升文化传媒公司

微信短视频怎么收藏?一文教你轻松掌握 随着微信功能的不断升级,微信短视频已经成为我们日常生活中不可或缺的一部分。无论是朋友分享的生活点滴,还是公众号推送的精彩内容,短视频都以其直观、生动的形式,吸引着我们的…

Qt——控件

目录 概念 QWidget核心属性 enabled geometry WindowFrame的影响 windowTitle windowIcon qrc的使用 windowOpacity cursor font toolTip focusPolicy ​编辑 styleSheet 按钮类控件 PushButton RadioButton CheckBox 显示类控件 Label textFormat pixm…

什么牌子的洗地机好?高端旗舰洗地机,清洁力强的洗地机品牌

科技水平的不断进步,人们对生活环境的要求日益提高,洗地机作为一种高效,便捷的清洁设备,在家务清洁中,越来越受重视,洗地机不仅在吸尘、拖地和深度清洁等方面表现出色,可以帮助用户轻松应对各种…

Swagger教程:【Swagger】让你的API文档焕然一新!

Swagger(现称为OpenAPI Specification)是一种用于描述RESTful API接口的规范。它允许您以机器可读和人类可读的方式定义服务,使得开发、测试、维护和文档化API变得更加高效。下面整理了一个基础的Swagger教程,包括其重要组成部分和…

2021 hnust 湖科大 计组课设 包含multisim14连线文件,报告,指导书

2021 hnust 湖科大 计组课设 包含multisim14连线文件,报告,指导书 描述 hnust计组课设要用到的东西都在里面了 下载链接 https://pan.baidu.com/s/1tHooJmhkrwX47JCqsg379g?pwd1111

计网期末复习指南(五):运输层(可靠传输原理、TCP协议、UDP协议、端口)

前言:本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点,从计算机网络体系结构出发到应用层,每一个协议层通过一篇文章进行总结,本系列正在持续更新中... 计网期末复习指南(一):计算机…

【计算机毕设】基于SpringBoot的民宿在线预定平台设计与实现 - 源码免费(私信领取)

免费领取源码 | 项目完整可运行 | v:chengn7890 诚招源码校园代理! 1. 研究目的 本研究旨在设计并实现一个基于SpringBoot的民宿在线预定平台。通过信息化手段提高民宿预定效率,方便用户查询房源、预定房间、在线支付和…

OBS+nginx+nginx-http-flv-module实现阿里云的推流和拉流

背景:需要将球机视频推送到阿里云nginx,使用网页和移动端进行播放,以前视频格式为RTMP,但是在网页上面播放RTMP格式需要安装flash插件,chrome浏览器不给安装,调研后发现可以使用nginx的模块nginx-http-flv-…

LlamaIndex介绍

LlamaIndex LangChain v0.2 教程分成以下部分: 1、入门 2、学习 3、用例 4、示例 5、高级 6、组件指南 RAG 用额外的信息来提高回答的质量。 分为 5个阶段: (1)loading 加载原始文件,LlamaHub 提供数百种连…

借助调试工具理解BLE协议_1.蓝牙简介和BLE工作流程

1.蓝牙简介 蓝牙是一种近距离无线通信技术,运行在2.4GHz免费频段,目前已大量应用于各种移动终端,物联网,健康医疗,智能家居等行业。蓝牙4.0以后的版本分为两种模式,单模蓝牙和双模蓝牙。 单模蓝牙&#xf…