点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
- Hadoop(已更完)
- HDFS(已更完)
- MapReduce(已更完)
- Hive(已更完)
- Flume(已更完)
- Sqoop(已更完)
- Zookeeper(已更完)
- HBase(已更完)
- Redis (已更完)
- Kafka(已更完)
- Spark(已更完)
- Flink(已更完)
- ClickHouse(正在更新···)
章节内容
上节我们完成了如下的内容:
- 单机安装
- 单机测试
- 集群安装
- 集群启动
上节情况
上节已经完成了ClickHouse 的安装和启动。
测试连接
clickhouse-client -m --host h121.wzk.icu --port 9000 --user default --password [email protected]
如果可以从 122 连接到 121 说明你的服务已经搭建好了。
你可以测试以下,是否三台节点之间都是互通的,确保服务和服务之间一切正常,方便我们后续的学习研究。
检验集群
任意连接一个节点,我们进行测试
h121
clickhouse-client -m --host h121.wzk.icu --port 9000 --user default --password [email protected]
SELECT * FROM system.clusters WHERE cluster = 'perftest_3shards_1replicas';
h122
clickhouse-client -m --host h122.wzk.icu --port 9001 --user default --password [email protected]
h123
clickhouse-client -m --host h123.wzk.icu --port 9001 --user default --password [email protected]
数据类型
简单介绍
支持DML,为了提高性能,较传统数据库而言,ClickHouse提供了复合数据类型。ClickHouse的Update和Delete就是由Alter变种实现的。
启动测试
我这里采用了 h121 机器的服务,当然如果你使用别的机器的服务也可以。
clickhouse-client -m --host h121.wzk.icu --port 9000 --user default --password [email protected]
整型
固定长度的整型,包括有符号整型,和无符号整型。
SELECT 255;
SELECT -128;
执行的结果截图如下图:
浮点型
建议尽可能以整数形式存储数据,例如,将固定精度的数字转换为整数值,如时间用毫秒为单位表示,因为浮点型计算行为可能引起四舍五入的误差。
SELECT 1-0.9;
SELECT 1/0;
SELECT 0/0;
执行的结果如下图:
Decimal
如果要求更高精度,可以选择Decimal类型,格式:Decimal(P,S)
- P:代表精度,决定总位数(正数部分+小数部分),取值0-38
- S:代表规模,决定小数位数,取值范围是0-P
ClickHouse对Decimal提供三种简写:
- Decimal32
- Decimal64
- Decimal128
相加、减精度取大
SELECT toDecimal32(2, 4) + toDecimal32(2, 2);
SELECT toDecimal32(4, 4) + toDecimal32(2, 2);
运行结果的截图如下图所示:
相乘精度取和
SELECT toDecimal32(2, 2) * toDecimal32(4, 4)
运行结果的截图如下图所示:
相除精度取被除数
SELECT toDecimal32(4, 4) / toDecimal32(2, 2)
运行结果的截图如下图所示:
字符串
String
字符串可以任意长度,它可以包含任意的字符集,包含空字节。
FixedString(N)
固定长度为N的字符串,N必须是严格的正自然数。当服务端读取长度小于N的字符串时候,通过在字符串末尾添加空字节来达到N字节长度。当服务端读取长度小于N的字符串的时候,将返回错误。
SELECT toFixedString('abc', 5), LENGTH(toFixedString('abc', 5)) AS LENGTH;
执行结果如下图:
UUID
ClickHouse将UUID这种在传统数据库中充当主键的类型直接做成了数据类型
创建新表
CREATE TABLE UUID_TEST(
`c1` UUID,
`c2` String
)ENGINE = memory;
执行结果如下图:
插入数据
INSERT INTO UUID_TEST SELECT generateUUIDv4(), 't1';
INSERT INTO UUID_TEST(c2) VALUES('t2');
执行结果如下图:
查询结果
SELECT * FROM UUID_TEST;
执行结果如下图:
枚举类型
包括 Enum8 和 Enum16 类型,保存 string = integer 的对应关系。
Enum8 用 String = Int8 对描述
Enum16 用 String = Int16 对描述。
创建新表
CREATE TABLE t_enum (
x Enum8('hello' = 1, 'word' = 2)
) ENGINE = TinyLog;
执行结果如下所示:
注意:这个列 x 只能存储定义列出的值,“Hello” 或者 “world”,如果插入其他值则会报错。
插入数据
INSERT INTO t_enum VALUES ('hello'), ('word'), ('hello');
执行结果如下图:
查询数据
SELECT * FROM t_enum;
如果需要看到对应行的数值,则必须将Enum转换为整数类型。
SELECT CAST(x, 'Int8') FROM t_enum;
执行结果如下图:
数组
Array(T):由 T 类型元素组成的数组。
T可以是任意类型,包含数组类型,但不推荐使用多维数组,ClickHouse对多维数组的支持有限。
例如,不能再MergeTree表中存储多维数组。
创建数组
SELECT array(1, 2.0) AS x, toTypeName(x);
SELECT [1, 2] AS x, toTypeName(x);
执行结果如下图:
如果是声明字段的时候,则需要指明数据类型:
CREATE TABLE Array_test (
`c1` Array(String)
) ENGINE = Memory;
元组
Tuple(T1,T2):元组,每个元素都有单独的类型。
创建元组的示例:
SELECT tuple(1, 'a') AS x, toTypeName(x);
执行的结果如下图:
注意:在定义表字段的时候也需要指明数据类型。
Date、DateTime
日期类型、用两个字节存储,表示 1970-01-01 (无符号)到当前的日期值。
布尔型
没有单独的类型来存储布尔值,可以使用 UInt8 类型,取值限制为 0 或 1。