关于ClickHouse列存储的那些事(一) | 青训营

316 阅读2分钟

ClickHouse是一个开源的列式数据库管理系统,用于实时OLAP的分析或汇总工作负载。

与行式数据库不同,ClickHouse采用了列式存储的结构组织数据,每个列被单独存储和压缩,从而实现高压缩率和查询性能。这使其成为处理海量实时数据的理想选择。

客户端连接示例

python

import pandas as pd
from sqlalchemy import create_engine

# 使用sqlalchemy连接ClickHouse
engine = create_engine("clickhouse://default:password@localhost:8123/default")

# 查询数据
sql = "SELECT * FROM test_table LIMIT 10" 
df = pd.read_sql(sql, engine)
print(df)

数据类型

ClickHouse支持丰富的数据类型,比如数值型、日期时间型、字符串型等。同时也支持Nullable和数组类型。

sql

CREATE TABLE data_types
(
  id UInt64, 
  name String,
  time DateTime DEFAULT now(),
  marks Array(UInt8)
)
ENGINE = Memory

数据导入

可以使用 INSERT、公用的表格式或 Parquet/ORC/JSON/CSV 格式导入数据。

python

df.to_sql("test_table", engine, index=False, if_exists="append")

分布式表

ClickHouse支持横切分片、度量分片等多种分布式表格式,可以横向扩展处理PB级数据。

sql

CREATE TABLE visits 
(
    ...
) ENGINE = Distributed(cluster, default, visits);

SQL查询

支持丰富的SQL查询功能,如分组、排序、 joins、子查询、窗口函数等。并提供功能强大的SQL解析和优化执行引擎。

sql

SELECT 
    count() AS count,
    countryId 
FROM table
GROUP BY countryId
ORDER BY count DESC

聚合查询

支持完整的SQL聚合查询,例如count、sum、avg、min、max、any、median等聚合函数。

sql

SELECT 
    sum(amount)
FROM orders

原子写入

ClickHouse采用一致性哈希和两个阶段提交机制,保证原子性写操作。写操作的记录被暂时存储,等所有副本确认后才提交到数据部分。

定制化分析

可以通过编写UDF扩展ClickHouse的功能。比如实现自定义的聚集函数、过滤条件等。

sql

CREATE FUNCTION custom_func()

ClickHouse通过其列式存储的设计理念,支持快速的OLAP案例。与之对应的数据导入、分布式表格、SQL查询等机制,均以支持大规模实时日志分析为目标。它的高可扩展性和原子性,也使其具有应对海量实时数据的优势。

通过本篇笔记,诸位可以初步了解了ClickHouse的一些重要概念和特性,以及使用Python连接和操作ClickHouse的示例代码。这可以为后续进一步学习和应用ClickHouse数据库奠定相对坚实的基础。