admin管理员组

文章数量:1642346

1.clickhouse的下载安装

这部分没有什么需要特别说明的,按照官方文档下载安装即可。
官方帮助文档
提前需要准备linux环境:准备clickhouse安装环境,如Mac OS或Linux(虚拟机或云服务器均可)
这里使用的是云服务器。

2.clickhousse的基本使用

实验内容:

  • 上传下发的employee.csv文件到clickhouse的employee表 ,并通过控制台打印出来。employee的列名称为id,name(员工姓名),bonus(奖金),department(部门)
  • 使用某种语言连接clickhouse,新建library表,上传library.csv文件到library表
  • 使用HTTP请求方式查询library表

参考文档:
https://clickhouse/docs/zh/interfaces/http
https://clickhouse/docs/zh/interfaces/jdbc
https://clickhouse/docs/zh/interfaces/cli
https://clickhouse/docs/zh/sql-reference/statements/

2.1建表与上传文件

执行bash,进入容器

sudo docker exec -it some-clickhouse-server bash

进入clickclient

创建数据库:

create database clickhousetest

在数据库中创建两个表:employeelibrary

  • employee
CREATE TABLE clickhousetest.employee (`id` Int32, `name` String, `bonus` Int32, `department` String) ENGINE = MergeTree ORDER BY id SETTINGS index_granularity=8192

  • library
CREATE TABLE clickhousetest.library (`id` Int32, `visit_date` String, `people` Int32) ENGINE = MergeTree ORDER BY id SETTINGS index_granularity=8192

上传两个CSV文件到服务器的文件中:

进入docker命令行,将服务器中文件导入到docker容器的目录sunyunqi下:

docker cp /home/ubuntu/clickhouse some-clickhouse-server:/sunyunqi/

然后执行下面的命令,将employee表中的内容以csv的格式读入到clickhouse.employee表中:

clickhouse-client --query="INSERT INTO clickhousetest.employee FORMAT CSV" < ./sunyunqi/employee.csv

library操作一样,结果如下:

clickhouse-client --query="INSERT INTO clickhousetest.library FORMAT CSV" < ./sunyunqi/library.csv

2.2 HTTP形式查询library表

执行bash后,执行下面命令可以得到结果为OK

curl 'http://localhost:8123'

下面查询employee表:

echo 'SELECT * FROM clickhousetest.employee' | curl 'http://localhost:8123/' --data-binary @-

3.OLAP查询

3.1 查询employee表每个部门的奖金最高的前两个人
select e1.name, e1.bonus, e1.department, e1.ranks from (
     select name, bonus, department, 
            dense_rank() over (partition by department order by bonus desc) as ranks
     from clickhousetest.employee) as e1
 where e1.ranks<=3


功能描述:根据PARTITION BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按PARTITION BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。密集的序列返回的时没有间隔的数.

3.2 查询图书馆浏览次数大于99人,而且id连续的行数不止3行的数据
SELECT id, visit_date, people from
(
    select *, count(*) over (partition by differ) as count
    from
    (
        select id, visit_date, people, (id - g) as differ
			from 	
                (select id, visit_date, people, row_number() OVER (order by id) as g
                 from clickhousetest.library as s
                 WHERE s.people > 99) as temp
    ) as s1
) as s2
where s2.count >= 3 order by id
  • 首先需要得到访问人数大于99人的表:temp,并且在这个表中我们记录现在的行号g

  • 使用原来的id减去现在的行号g,得到一个结果记做differ,这个differ反映了数据是否是连续的

  • 根据这个是否连续的值进行分组,计算这个组的有多少行,作为一个新的属性count

  • 在上表的结果中挑选出count大于3的即为最终结果。

4.目录结构

随便找一个employee表进去:

  • 分区目录

all_1_1_0和all_2_2_0都是分区目录

分区ID_最小数据块编号_最大数据块编号_层级构成。在本例中,分区ID是all, 最小数据块编号是1,最大数据库编号是1,层级是0

  • 卸载后的表分区目录

通过DETACH语句卸载后的表分区存放位置

  • 插入一条数据后查看存储文件发生变化
clickhouse-client --query="INSERT INTO clickhousetest.employee (*) values (8, 'sunyunqi', 1000, 'GWY')"


层级构成发生变化,可能是发生了合并?

本文标签: 使用说明ClinkHouse