欢迎阅读我们的 3 月份新闻通讯,这份通讯每月都会总结 ClickHouse 的最新动态。在下面,您将找到我们发布的新功能、最近的聚会和网络研讨会的录音、一些使用窗口函数的简洁查询以及一些推荐读物。
ClickHouse v22.2
我们发布了 ClickHouse 22.2,这是您最喜欢的数据库的最新版本。亮点包括
- 投影已进入生产就绪阶段,并默认启用。它们允许您将表的某一部分存储在原始表的子目录中,通常使用不同的排序键或聚合原始数据——类似于物化视图,但没有所有开销。它们的使用非常简单:查询将被自动分析并重定向到投影,如果在那里读取的数据更少,则可以产生相同的结果。几乎就像魔法!
- 插入时的自定义去重——一个新设置
[insert_deduplication_token]
允许您指定一个自定义令牌(任何字符串),用于确定块是否已被插入。如果已插入,则任何后续具有相同令牌的块都将被丢弃。任何插入语句都会创建一个块,但大型插入会被分成大约 100 万行的多个块(由max_insert_block_size控制)。这使得在 ClickHouse 中实现精确一次语义变得更容易。注意:默认情况下,ClickHouse 已经会对完全相同的插入数据块(按相同顺序包含相同的行)进行去重。如果您需要,此新设置可以让您更好地控制此过程。 - 默认表引擎——您现在可以设置默认表引擎,因此在创建表时不再需要指定引擎。例如
SET default_table_engine = 'MergeTree'
CREATE TABLE table1 (x int PRIMAY KEY (x))
SET allow_experimental_nlp_functions = 1
SELECT detectLanguage('Ich bin ein Berliner')
// returns 'de'
- dictGet* 函数中的隐式转换,现在您可以简化您的查询!例如,当您有一个字典,其主键为 UInt32 时,您可以使用以下任何一种方式访问它
dictGetOrNull(dict, attr, 1)
dictGetOrNull(dict, attr, '1')
dictGetOrNull(dict, attr, 1.0)
dictGetOrNull(dict, attr, toUInt8(1))
dictGetOrNull(dict, attr, toInt256(1))
聚会与网络研讨会
过去几周,ClickHouse 领域举办了许多聚会和网络研讨会。查看录音(如果您喜欢,可以 2 倍速播放,我们不会评判您)
- 与 Contentsquare 的虚拟聚会,我们了解了他们如何使用 ClickHouse 为其体验分析平台提供支持。这是一段令人印象深刻的旅程,从 Elasticsearch 迁移到 ClickHouse 开始,成本降低了 11 倍(数据量增加了 6 倍),速度提高了 10 倍!我们还了解了 ClickHouse 代理 (Chproxy) 项目以及 Alexey 在 2021 年和 2022 年最喜欢的 ClickHouse 功能。亮点:在1:20:12处收听我们关于新 JSON 数据类型的计划。
- 在v22.02 版本网络研讨会中了解我们发布的新功能,包括在42:05处介绍的用于在 S3 之上运行 ClickHouse 的即将到来的性能改进(如果我们这么说的话,性能数据非常令人印象深刻!)。
- 旧金山湾区聚会邀请了来自Materialize 和 FastNetMon 的嘉宾演讲者。
即将举行的网络研讨会
ClickHouse v22.3 版本网络研讨会
- 时间?3 月 17 日星期四上午 8 点 PDT / 下午 4 点 GMT
添加到您的日历
本月查询:窗口函数来帮忙!
您知道 ClickHouse 有窗口函数吗?这是一个相对较新的(2021 年初)功能,但非常强大。让我们快速了解一下以前更难实现的可能性。注意:我们将使用英国房价数据集,其中包含过去几十年中英国所有房产交易的信息,因此您可以随意重现这些查询!
查询 1:与队列平均值进行比较
SELECT avg(price) OVER(PARTITION BY postcode1) AS postcode_avg, *
FROM uk_price_paid
WHERE type = 'flat'
ORDER BY price DESC
此查询将显示英国有史以来出售的最昂贵的公寓/单元房,此外还将在第一列中显示其邮政编码的平均价格。因此,现在我们可以看看谁真的支付了过高的价格!
查询 2:此房产之前何时出售?
SELECT
lagInFrame(date) OVER (PARTITION BY postcode1, postcode2, addr1, addr2 ORDER BY date ASC) AS previous_date,
lagInFrame(price) OVER (PARTITION BY postcode1, postcode2, addr1, addr2 ORDER BY date ASC) AS previous_price,
* FROM uk_price_paid
对于像这样的时间序列数据集,我们通常希望查看特定实体的先前记录。我们可以使用lagInFrame
来实现。如果我们使用first_value
,我们将获得房产首次出售的时间(数据集仅追溯到 1995 年)。
查询 3:使用窗口函数排序
您还可以根据窗口函数进行排序。例如,此查询显示最昂贵的邮政编码中最昂贵的子邮政编码(在英国,邮政编码分为两部分)
SELECT DISTINCT
postcode1,
postcode2,
avg(price) OVER (PARTITION BY postcode1, postcode2) AS avg_price
FROM uk_price_paid
WHERE type = 'flat'
ORDER BY
avg(price) OVER (PARTITION BY postcode1) DESC,
avg_price DESC
请注意ORDER BY
子句中使用的两个窗口函数。对于那些熟悉伦敦的人来说,您不会对此查询在梅菲尔和苏荷边缘找到 W1S 邮政编码的结果感到惊讶。
阅读角
我们一直在阅读
- 我们如何扩展 ClickHouse 集群,由我们的朋友 Contentsquare 撰写。他们有一个巧妙的“ClickHouse 重新分片工具”,结合了
clickhouse-backup
和clickhouse-copier
。如果您正在运行 ClickHouse 集群,那么非常值得一读! - Opensee:使用 ClickHouse 每天分析数 TB 的金融数据,由我们的朋友金融分析公司 Opensee 撰写。他们多年来一直在使用 ClickHouse 分析金融机构的风险概况。
- ClickHouse 22.2 版本博文——了解最新 ClickHouse 版本和令人兴奋的新功能,包括生产就绪的投影、自定义去重和灵活的内存限制。
新的 ClickHouse 用户:欢迎Gigasheet。加入我们吧!
感谢您的阅读。我们下个月再见!
ClickHouse 团队
照片由Fernando Venzano在Unsplash上拍摄