ClickHouse是带有SQL样接口的面向列的数据库系统。它的主要卖点是在实时处理巨大数据集时高性能。您需要做出的牺牲对更新,删除或交易的支持非常有限。如果您的数据集是巨大的,并且您主要阅读,汇总和插入,则可以对您有用。
可以说,它更适合作为辅助数据库,而不是主要数据库。
与Docker一起运行Clickhouse
您可以将Clickhouse与ClickHouse Cloud一起使用,这就是大多数文档所指的,但是对于某些练习,您也可以在本地运行。
最简单的方法是使用Docker。运行本地服务器执行此命令:
$ docker run -d --name clickhouse-server clickhouse/clickhouse-server
然后我们可以连接到它:
$ docker exec -it clickhouse-server clickhouse-client
如果您需要多个服务器,只需相应地更改clickhouse-server
。
让我们进行一些查询
d7ba07d71412 :) select 2 + 2
SELECT 2 + 2
Query id: 1565da74-dc33-4d1f-84ae-d5241b052b5c
┌─plus(2, 2)─┐
│ 4 │
└────────────┘
1 row in set. Elapsed: 0.001 sec.
d7ba07d71412 :) select concat('Hello', ', ', 'world!')
SELECT concat('Hello', ', ', 'world!')
Query id: 090687b1-3a8f-4300-9368-579a87c348c0
┌─concat('Hello', ', ', 'world!')─┐
│ Hello, world! │
└─────────────────────────────────┘
1 row in set. Elapsed: 0.001 sec.
愚蠢
我们还没有任何数据,但是我们可以从system.numbers
中进行选择 - 这是从0开始的所有数字的无限虚拟表。
d7ba07d71412 :) select if(number % 15 = 0, 'FizzBuzz', if(number % 5 = 0, 'Buzz', if(number % 3 = 0, 'Fizz', toString(number)))) as FizzBuzz from system.numbers where number >= 1 limit 100
SELECT if((number % 15) = 0, 'FizzBuzz', if((number % 5) = 0, 'Buzz', if((number % 3) = 0, 'Fizz', toString(number)))) AS FizzBuzz
FROM system.numbers
WHERE number >= 1
LIMIT 100
Query id: 8badf288-95b5-4121-b4ad-18730fbfafc1
┌─FizzBuzz─┐
│ 1 │
│ 2 │
│ Fizz │
│ 4 │
│ Buzz │
│ Fizz │
│ 7 │
│ 8 │
│ Fizz │
│ Buzz │
│ 11 │
│ Fizz │
│ 13 │
│ 14 │
│ FizzBuzz │
│ 16 │
│ 17 │
│ Fizz │
│ 19 │
│ Buzz │
│ Fizz │
│ 22 │
│ 23 │
│ Fizz │
│ Buzz │
│ 26 │
│ Fizz │
│ 28 │
│ 29 │
│ FizzBuzz │
│ 31 │
│ 32 │
│ Fizz │
│ 34 │
│ Buzz │
│ Fizz │
│ 37 │
│ 38 │
│ Fizz │
│ Buzz │
│ 41 │
│ Fizz │
│ 43 │
│ 44 │
│ FizzBuzz │
│ 46 │
│ 47 │
│ Fizz │
│ 49 │
│ Buzz │
│ Fizz │
│ 52 │
│ 53 │
│ Fizz │
│ Buzz │
│ 56 │
│ Fizz │
│ 58 │
│ 59 │
│ FizzBuzz │
│ 61 │
│ 62 │
│ Fizz │
│ 64 │
│ Buzz │
│ Fizz │
│ 67 │
│ 68 │
│ Fizz │
│ Buzz │
│ 71 │
│ Fizz │
│ 73 │
│ 74 │
│ FizzBuzz │
│ 76 │
│ 77 │
│ Fizz │
│ 79 │
│ Buzz │
│ Fizz │
│ 82 │
│ 83 │
│ Fizz │
│ Buzz │
│ 86 │
│ Fizz │
│ 88 │
│ 89 │
│ FizzBuzz │
│ 91 │
│ 92 │
│ Fizz │
│ 94 │
│ Buzz │
│ Fizz │
│ 97 │
│ 98 │
│ Fizz │
│ Buzz │
└──────────┘
100 rows in set. Elapsed: 0.002 sec. Processed 65.41 thousand rows, 523.27 KB (31.21 million rows/s., 249.67 MB/s.)
d7ba07d71412 :)
相同的注释:
- 即使Clickhouse不是关系数据库,甚至令人惊讶的是复杂的SQL也可以正常工作
-
system.numbers
被隐式订购,因此system.numbers where number >= 1 limit 100
将返回1到100 - 我们需要在
if(number % 3 = 0, 'Fizz', toString(number))
中的明确打字,SQL数据库倾向于进行大量自动类型的转换,clickhouse sose so so
从Python连接
我们不会从repper进行编码,所以让我们编写一些代码。没有官方的Ruby驾驶员,但是有一个Python。还有一些非正式的红宝石司机。
$ pip3 install clickhouse-connect
我们还需要公开Docker Container的Clickhouse端口。首先,让我们删除旧的(我们可以在运行容器上对其进行调整,但是它更复杂,而且我们在那里没有任何数据):
$ docker stop clickhouse-server
$ docker rm clickhouse-server
并从端口8123映射:
$ docker run -p 8123:8123 -d --name clickhouse-server clickhouse/clickhouse-server
Python Clickhouse Fizzbuzz
现在,我们可以编写一些Python代码与我们的数据库交谈:
#!/usr/bin/env python3
import clickhouse_connect
client = clickhouse_connect.get_client()
query = """
select
if(number % 15 = 0, 'FizzBuzz',
if(number % 5 = 0, 'Buzz',
if(number % 3 = 0, 'Fizz',
toString(number))))
as FizzBuzz
from system.numbers
where number >= 1
limit 100
"""
print(client.command(query))
client.command(query)
的结果是一个多行字符串,因此对于调试最有用。
还有其他方法可以返回更明显的数据结构,例如元组列表,也可以返回pandas dataframe等。
下一步是什么
所以我们让Clickhouse运行。在以后的帖子中,我们将与一些真实的数据一起使用。