国外的网站服务商,响应式网站设计与实现论文,网站平台建设规划,php网站开发权限管理点击上方蓝色字体#xff0c;选择“设为星标”回复”资源“获取更多资源大数据技术与架构点击右侧关注#xff0c;大数据开发领域最强公众号#xff01;暴走大数据点击右侧关注#xff0c;暴走大数据#xff01;ClickHouse相关文章推荐#xff1a;战斗民族开源 | ClickHo… 点击上方蓝色字体选择“设为星标”回复”资源“获取更多资源大数据技术与架构点击右侧关注大数据开发领域最强公众号暴走大数据点击右侧关注暴走大数据ClickHouse相关文章推荐战斗民族开源 | ClickHouse万亿数据双中心的设计与实践你需要懂一点ClickHouse的基础知识趣头条实战 | 基于FlinkClickHouse构建实时数据平台PrometheusClickhouse实现业务告警基于ClickHouse的用户行为分析实践ClickHouse 是一款由俄罗斯Yandex公司开源的OLAP数据库拥有者卓越的性能表现在官方公布的基准测试中ClickHouse的平均响应速度是Vertica的2.63倍、InfiniDB的17倍、MonetDB的27倍、Hive的126倍、MySQL的429倍以及Greenplum的10倍。自2016年开源以来ClickHouse一直保持着飞速的发展是目前业界公认的OLAP数据库黑马已在头条、阿里、腾讯、新浪、青云等众多公司得以应用。作为一款分析型数据库ClickHouse提供了许多数据类型它们可以划分为基础类型、复合类型和特殊类型。其中基础类型使ClickHouse具备了描述数据的基本能力而另外两种类型则使ClickHouse的数据表达能力更加丰富立体。本文主要来谈ClickHouse的复合类型ClickHouse提供了数组、元组、枚举和嵌套四类复合类型。这些类型通常是其他数据库原生不具备的特性。拥有了复合类型之后ClickHouse的数据模型表达能力更强了。Array数组有两种定义形式常规方式array(T)SELECT array(1, 2) as a , toTypeName(a)┌─a───┬─toTypeName(array(1, 2))─┐│ [1,2] │ Array(UInt8) │└─────┴────────────────┘或者简写方式[T]SELECT [1, 2]通过上述的例子可以发现在查询时并不需要主动声明数组的元素类型。因为ClickHouse的数组拥有类型推断的能力推断依据以最小存储代价为原则即使用最小可表达的数据类型。例如在上面的例子中array(1, 2)会通过自动推断将UInt8作为数组类型。但是数组元素中如果存在Null值则元素类型将变为Nullable例如 SELECT [1, 2, null] as a , toTypeName(a)┌─a──────┬─toTypeName([1, 2, NULL])─┐│ [1,2,NULL] │ Array(Nullable(UInt8)) │└────────┴─────────────────┘细心的读者可能已经发现在同一个数组内可以包含多种数据类型例如数组[1, 2.0]是可行的。但各类型之间必须兼容例如数组[1, 2]则会报错。在定义表字段时数组需要指定明确的元素类型例如CREATE TABLE Array_TEST ( c1 Array(String)) engine Memory2. Tuple元组类型由1n个元素组成每个元素之间允许设置不同的数据类型且彼此之间不要求兼容。元组同样支持类型推断其推断依据仍然以最小存储代价为原则。与数组类似元组也可以使用两种方式定义常规方式tuple(T)SELECT tuple(1,a,now()) AS x, toTypeName(x)┌─x─────────────────┬─toTypeName(tuple(1, a, now()))─┐│ (1,a,2019-08-28 21:36:32) │ Tuple(UInt8, String, DateTime) │└───────────────────┴─────────────────────┘或者简写方式(T)SELECT (1,2.0,null) AS x, toTypeName(x)┌─x──────┬─toTypeName(tuple(1, 2., NULL))───────┐│ (1,2,NULL) │ Tuple(UInt8, Float64, Nullable(Nothing)) │└───────┴──────────────────────────┘在定义表字段时元组也需要指定明确的元素类型CREATE TABLE Tuple_TEST ( c1 Tuple(String,Int8)) ENGINE Memory;元素类型和泛型的作用类似可以进一步保障数据质量。在数据写入的过程中会进行类型检查。例如写入INSERT INTO Tuple_TEST VALUES( (abc , 123) )是可行的而写入INSERT INTO Tuple_TEST VALUES( (abc , efg) )则会报错。3. EnumClickHouse支持枚举类型这是一种在定义常量时经常会使用的数据类型。ClickHouse提供了Enum8和Enum16两种枚举类型它们除了取值范围不同之外别无二致。枚举固定使用(String:Int) Key/Value键值对的形式定义数据所以Enum8和Enum16分别会对应(String:Int8)和(String:Int16)例如CREATE TABLE Enum_TEST ( c1 Enum8(ready 1, start 2, success 3, error 4)) ENGINE Memory;在定义枚举集合的时候有几点需要注意。首先Key和Value是不允许重复的要保证唯一性。其次Key和Value的值都不能为Null但Key允许是空字符串。在写入枚举数据的时候只会用到Key字符串部分例如INSERT INTO Enum_TEST VALUES(ready);INSERT INTO Enum_TEST VALUES(start);数据在写入的过程中会对照枚举集合项的内容逐一检查。如果Key字符串不在集合范围内则会抛出异常比如执行下面的语句就会出错INSERT INTO Enum_TEST VALUES(stop);可能有人会觉得完全可以使用String代替枚举为什么还需要专门的枚举类型呢这是出于性能的考虑。因为虽然枚举定义中的Key属于String类型但是在后续对枚举的所有操作中(包括排序、分组、去重、过滤等)会使用Int类型的Value值。4. Nested嵌套类型顾名思义是一种嵌套表结构。一张数据表可以定义任意多个嵌套类型字段但每个字段的嵌套层级只支持一级即嵌套表内不能继续使用嵌套类型。对于简单场景的层级关系或关联关系使用嵌套类型也是一种不错的选择。例如下面的nested_test是一张模拟的员工表它的所属部门字段就使用了嵌套类型CREATE TABLE nested_test ( name String, age UInt8 , dept Nested( id UInt8, name String )) ENGINE Memory;ClickHouse的嵌套类型和传统的嵌套类型不相同导致在初次接触它的时候会让人十分困惑。以上面这张表为例如果按照它的字面意思来理解会很容易理解成nested_test与dept 是一对一的包含关系其实这是错误的。不信可以执行下面的语句看看会是什么结果INSERT INTO nested_test VALUES (nauu,18, 10000, 研发部);Exception on client:Code: 53. DB::Exception: Type mismatch in IN or VALUES section. Expected: Array(UInt8). Got: UInt64注意上面的异常信息它提示期望写入的是一个Array数组类型。现在大家应该明白了嵌套类型本质是一种多维数组的结构。嵌套表中的每个字段都是一个数组并且行与行之间数组的长度无须对齐。所以需要把刚才的INSERT语句调整成下面的形式INSERT INTO nested_test VALUES (bruce , 30 , [10000,10001,10002], [研发部,技术支持中心,测试部]);--行与行之间,数组长度无须对齐INSERT INTO nested_test VALUES (bruce , 30 , [10000,10001], [研发部,技术支持中心]);需要注意的是在同一行数据内每个数组字段的长度必须相等。例如在下面的示例中由于行内数组字段的长度没有对齐所以会抛出异常INSERT INTO nested_test VALUES (bruce , 30 , [10000,10001], [研发部,技术支持中心,测试部]);DB::Exception: Elements dept.id and dept.name of Nested data structure dept (Array columns) have different array sizes..在访问嵌套类型的数据时需要使用点符号例如SELECT name, dept.id, dept.name FROM nested_test┌─name─┬─dept.id──┬─dept.name─────────────┐│ bruce │ [16,17,18] │ [研发部,技术支持中心,测试部] │└────┴───────┴────────────────────┘关于作者朱凯ClickHouse贡献者之一ClickHouse布道者资深架构师十多年IT从业经验对大数据领域主流技术与解决方案有深入研究擅长分布式系统的架构设计与整合。曾主导过多款大数据平台级产品的规划、设计与研发工作一线实战经验丰富。现就职于远光软件股份有限公司任大数据事业部平台开发部总经理。著有《企业级大数据平台构建架构与实现》 《ClickHouse原理解析与应用实践》等书。国内首本全方位讲解ClickHouse的技术书这是一本可帮助读者深度理解并全面掌握ClickHouse运行原理并进行实践开发的工具书涵盖了ClickHouse的时代背景、发展历程、核心概念、基础功能、运行原理、实践指导等多个维度的内容。一本书帮你驾驭ClickHouse。版权声明本文为大数据技术与架构整理原作者独家授权。未经原作者允许转载追究侵权责任。编辑冷眼丶微信公众号import_bigdata欢迎点赞收藏转发朋友圈素质三连文章不错点个【在看】吧 ?