clickhouse入门
#database #nosql #clickhouse

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运行。在以后的帖子中,我们将与一些真实的数据一起使用。

代码

All code for this post is available on GitHub.