ClickHouse 24.9 版本发布说明

图片

本文字数:7295;估计阅读时间:19 分钟

作者:ClickHouse Team

本文在公众号【ClickHouseInc】首发

图片

又到新版本发布的时间了!

发布概要

本次ClickHouse 24.9 版本包含了23个新功能🎁、14性能优化🛷、76个bug修复🐛

本次更新亮点包括:可刷新物化视图新增 APPEND 子句、JSON 数据类型支持更多新函数、自动模式推断现在还支持返回 Variant 类型。

欢迎新贡献者

一如既往地欢迎 24.9 版本中的新贡献者!ClickHouse 的受欢迎离不开社区的持续努力,看到这个社区不断壮大,总是让人倍感欣慰。

以下是新加入的贡献者名单:

1on, Alexey Olshanskiy, Alexis Arnaud, Austin Bruch, Denis Hananein, Dergousov, Gabriel Mendes, Konstantin Smirnov, Kruglov Kirill, Marco Vilas Boas, Matt Woenker, Maxim Dergousov, Michal Tabaszewski, NikBarykin, Oleksandr, Pedro Ferreira, Rodrigo Garcia, Samuel Warfield, Sergey (Finn) Gnezdilov, Tuan Pham Anh, Zhigao Hong, baolin.hbl, gao chuan, haozelong, imddba, kruglov, leonkozlowski, m4xxx1m, marco-vb, megao, mmav, neoman36, okunev, siyuan

可刷新物化视图新增 APPEND 功能

贡献者:Michael Kolupaev

可刷新物化视图是一种实验性功能,能够将查询结果存储以便快速读取。在本次发布中,我们新增了 APPEND 功能,使得在更新视图时无需替换整个视图内容,而是直接将新行追加到表末尾。

这个功能的一个典型应用场景是捕获某一时间点的数据快照。假设我们有一个事件表,该表由 Redpanda、Kafka 或其他流数据平台的消息流持续填充。

SELECT *
FROM events
LIMIT 10Query id: 7662bc39-aaf9-42bd-b6c7-bc94f2881036┌──────────────────ts─┬─uuid─┬─count─┐
│ 2008-08-06 17:07:19 │ 0eb  │   547 │
│ 2008-08-06 17:07:19 │ 60b  │   148 │
│ 2008-08-06 17:07:19 │ 106  │   750 │
│ 2008-08-06 17:07:19 │ 398  │   875 │
│ 2008-08-06 17:07:19 │ ca0  │   318 │
│ 2008-08-06 17:07:19 │ 6ba  │   105 │
│ 2008-08-06 17:07:19 │ df9  │   422 │
│ 2008-08-06 17:07:19 │ a71  │   991 │
│ 2008-08-06 17:07:19 │ 3a2  │   495 │
│ 2008-08-06 17:07:19 │ 598  │   238 │
└─────────────────────┴──────┴───────┘

在这个数据集中,uuid 列包含 4096 个值。我们可以通过以下查询来找到总计数最高的那些值:

SELECTuuid,sum(count) AS count
FROM events
GROUP BY ALL
ORDER BY count DESC
LIMIT 10┌─uuid─┬───count─┐
│ c6f  │ 5676468 │
│ 951  │ 5669731 │
│ 6a6  │ 5664552 │
│ b06  │ 5662036 │
│ 0ca  │ 5658580 │
│ 2cd  │ 5657182 │
│ 32a  │ 5656475 │
│ ffe  │ 5653952 │
│ f33  │ 5653783 │
│ c5b  │ 5649936 │
└──────┴─────────┘

例如,如果我们希望每 10 秒记录一次每个 uuid 的计数,并将这些计数存储在一个新表 events_snapshot 中,events_snapshot 的表结构可以是这样的:

CREATE TABLE events_snapshot (ts DateTime32,uuid String,count UInt64
) 
ENGINE = MergeTree 
ORDER BY uuid;

接下来,我们可以创建一个可刷新物化视图,将数据填充到这个表中:

SET allow_experimental_refreshable_materialized_view=1;CREATE MATERIALIZED VIEW events_snapshot_mv
REFRESH EVERY 10 SECOND APPEND TO events_snapshot
AS SELECTnow() AS ts,uuid,sum(count) AS count
FROM events
GROUP BY ALL;

然后,我们可以查询 events_snapshot 表,以获取某个特定 uuid 随时间变化的计数记录:

SELECT *
FROM events_snapshot
WHERE uuid = 'fff'
ORDER BY ts ASC
FORMAT PrettyCompactMonoBlock┌──────────────────ts─┬─uuid─┬───count─┐
│ 2024-10-01 16:12:56 │ fff  │ 5424711 │
│ 2024-10-01 16:13:00 │ fff  │ 5424711 │
│ 2024-10-01 16:13:10 │ fff  │ 5424711 │
│ 2024-10-01 16:13:20 │ fff  │ 5424711 │
│ 2024-10-01 16:13:30 │ fff  │ 5674669 │
│ 2024-10-01 16:13:40 │ fff  │ 5947912 │
│ 2024-10-01 16:13:50 │ fff  │ 6203361 │
│ 2024-10-01 16:14:00 │ fff  │ 6501695 │
└─────────────────────┴──────┴─────────┘

Variant 类型的模式推断

贡献者:Shaun Struwig

ClickHouse 现在支持在模式推断中自动使用 Variant 数据类型。这一功能默认关闭,可以通过设置 ``input_format_try_infer_variants`` 来启用。

让我们来看一个示例,了解该功能如何运作。假设我们读取以下文件:

data1.json

{"id": [1], "name": "Mark"}
{"id": "agerty", "name": "Dale"}

文件中,id 字段在第一行是一个整数数组,在第二行是一个字符串。我们可以查询该文件以查看 id 列的类型:

select *, toTypeName(id)
FROM file('data1.json')
SETTINGS input_format_try_infer_variants=1;┌─id─────┬─name─┬─toTypeName(id)──────────────────────────┐
│ [1]    │ Mark │ Variant(Array(Nullable(Int64)), String) │
│ agerty │ Dale │ Variant(Array(Nullable(Int64)), String) │
└────────┴──────┴─────────────────────────────────────────┘

如果没有启用 input_format_try_infer_variants=1,则会收到以下错误消息:

Received exception:
Code: 636. DB::Exception: The table structure cannot be extracted from a JSON format file. Error:
Code: 53. DB::Exception: Automatically defined type String for column 'id' in row 1 differs from type defined by previous rows: Array(Int64). You can specify the type for this column using setting schema_inference_hints. (TYPE_MISMATCH) (version 24.9.1.3278 (official build)).
You can specify the structure manually: (in file/path/to/24.9/data1.json). (CANNOT_EXTRACT_TABLE_STRUCTURE)

需要注意的是,Variant 类型并不总是会在您预期的地方被推断。例如,如果 id 字段中的值可以被转换为 String 类型,即使 Variant 类型也是可推断的,推断结果仍然会是 String 类型。以下文件就是这种情况:

data2.json

{"id": 1, "name": "Mark"}
{"id": "agerty", "name": "Dale"}
{"id": "2021-01-04", "name": "Tom"}

当运行以下查询时:

select *, toTypeName(id)
FROM file('data2.json')
SETTINGS input_format_try_infer_variants=1;┌─id─────────┬─name─┬─toTypeName(id)───┐
│ 1          │ Mark │ Nullable(String) │
│ agerty     │ Dale │ Nullable(String) │
│ 2021-01-04 │ Tom  │ Nullable(String) │
└────────────┴──────┴──────────────────┘

id 列会被推断为 Nullable(String),因为所有值都可以被转换为字符串。不过,您仍然可以通过提供提示,将 id 列推断为 Variant 类型:

SET allow_experimental_variant_type=1;SELECT *, toTypeName(id) 
FROM  file('data2.json') 
SETTINGS schema_inference_hints='id Variant(String, Int64, Date)';┌─id─────────┬─name─┬─toTypeName(id)───────────────┐
│ 1          │ Mark │ Variant(Date, Int64, String) │
│ agerty     │ Dale │ Variant(Date, Int64, String) │
│ 2021-01-04 │ Tom  │ Variant(Date, Int64, String) │
└────────────┴──────┴──────────────────────────────┘

用于 JSON 数据分析的聚合函数

贡献者:Pavel Kruglov

在 24.8 版本中,我们介绍了新的 JSON 数据类型。这次更新中,我们为 JSON 和 Dynamic 数据类型新增了更多实用函数。以下是一个示例数据集:

data3.json

{"id": 1, "name": "Mark"}
{"id": "agerty", "name": "Dale"}
{"id": "2021-01-04", "name": "Tom"}
{"id": ["1", 2, "3"], "name": "Alexey", "location": "Netherlands"}

首先,distinctJSONPaths 函数可以用来返回唯一的 JSON 路径。

SELECT distinctJSONPaths(json)
FROM file('data3.json', JSONAsObject)
FORMAT Vertical;Row 1:
──────
distinctJSONPaths(json): ['id','location','location.city','location.country','name']

如果您还想查看类型,可以使用 distinctJSONPathsAndTypes 函数:

SELECT distinctJSONPathsAndTypes(json)
FROM file('data3.json', JSONAsObject)
FORMAT Vertical;Row 1:
──────
distinctJSONPathsAndTypes(json): {'id':['Array(Nullable(String))','Int64','String'],'location':['String'],'location.city':['String'],'location.country':['String'],'name':['String']}

最后,distinctDynamicTypes 函数可以返回 Dynamic 列中的唯一数据类型。

SELECT distinctDynamicTypes(json.id)
FROM file('data3.json', JSONAsObject)
FORMAT VerticalRow 1:
──────
distinctDynamicTypes(json.id): ['Array(Nullable(String))','Int64','String']

URL 引擎支持 _headers 列

贡献者:Flynn

现在,查询 url 表函数时,可以通过 _headers 虚拟列访问响应头信息:

SELECT _headers
FROM url(
'https://en.wikipedia.org/w/api.php?action=query&list=recentchanges&rcprop=title%7Cids%7Csizes%7Cflags%7Cuser%7Cuserid%7Ctimestamp&format=json&rcdir=newer'
)
LIMIT 1
FORMAT Vertical;Row 1:
──────
_headers: {'accept-ranges':'bytes','age':'0','cache-control':'private, must-revalidate, max-age=0','content-disposition':'inline; filename=api-result.json','content-type':'application/json; charset=utf-8','date':'Tue, 01 Oct 2024 15:32:59 GMT','nel':'{ "report_to": "wm_nel", "max_age": 604800, "failure_fraction": 0.05, "success_fraction": 0.0}','report-to':'{ "group": "wm_nel", "max_age": 604800, "endpoints": [{ "url": "https://intake-logging.wikimedia.org/v1/events?stream=w3c.reportingapi.network_error&schema_uri=/w3c/reportingapi/network_error/1.0.0" }] }','server':'mw-api-ext.codfw.main-54d5bc66d9-98km5','server-timing':'cache;desc="pass", host;desc="cp3067"','set-cookie':'WMF-Last-Access=01-Oct-2024;Path=/;HttpOnly;secure;Expires=Sat, 02 Nov 2024 12:00:00 GMT','strict-transport-security':'max-age=106384710; includeSubDomains; preload','transfer-encoding':'chunked','vary':'Accept-Encoding,Treat-as-Untrusted,X-Forwarded-Proto,Cookie,Authorization','x-cache':'cp3067 miss, cp3067 pass','x-cache-status':'pass','x-client-ip':'82.35.72.115','x-content-type-options':'nosniff','x-frame-options':'DENY'}

overlay 函数

如果您需要将字符串片段替换为另一个字符串,overlay 函数让这一过程更为简单。只需提供初始字符串、替换字符串、替换的起始位置以及替换字符的数量即可。

我们可以利用这个函数来表达 chDB 【https://clickhouse.com/docs/en/chdb】的酷炫之处!

SELECT overlay('ClickHouse is cool', 'and chDB are', 12, 2) AS res┌─res──────────────────────────┐
│ ClickHouse and chDB are cool │
└──────────────────────────────┘

征稿启示

面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/444745.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang反射解说

在Go语言中,反射(Reflection)是一种强大的机制,允许程序在运行时检查、修改和操作变量的类型信息。 反射主要用于处理那些在编译时无法确定类型的情况,比如处理接口类型的值、实现通用的函数等。 Go语言中反射的基本…

邮件系统国产化改造: 保障信息安全、提升效率的最佳选择

在当前数字化转型的大背景下,我国政府提出了构建网络强国和数字强国的宏伟蓝图。这一战略的实施,不仅为数字政府的建设提供了坚实的基础,也为政府和企业的数字化升级指明了方向。在这一进程中,邮件系统的国产化改造就显得尤为重要…

Chromium 关闭 Google Chrome 后继续运行后台应用功能分析c++

此功能允许关闭 Google Chrome 后继续运行后台,控制此功能的开关是 // Set to true if background mode is enabled on this browser. //更改此值可以修改默认开启关闭 inline constexpr char kBackgroundModeEnabled[] "background_mode.enabled"; …

前端的全栈混合之路Meteor篇:分布式数据协议DDP深度剖析

本文属于进阶篇,并不是太适合新人阅读,但纯粹的学习还是可以的,因为后续会实现很多个ddp的版本用于web端、nodejs端、安卓端和ios端,提前预习和复习下。ddp协议是一个C/S架构的协议,但是客户端也同时可以是服务端。 什…

STM32F407寄存器操作(DMA+SPI)

1.前言 前面看B站中有些小伙伴吐槽F4的SPIDMA没有硬件可控的CS引脚,那么今天我就来攻破这个问题 我这边暂时没有SPI的从机芯片,并且接收的过程与发送的过程类似,所以这里我就以发送的过程为例了。 2.理论 手册上给出了如下的描述 我们关注…

Spring Boot 学习之路 -- Thymeleaf 模板引擎

前言 最近因为业务需要,被拉去研究后端的项目,代码框架基于 Spring Boot,后端对我来说完全小白,需要重新学习研究…出于个人习惯,会以 Blog 文章的方式做一些记录,文章内容基本来源于「 Spring Boot 从入门…

微信小程序-分包加载

一.分包的意义 小程序是由多个页面构成,为了因为代码量多,体积大导致用户打开速度变慢,小程序提供了分包加载数据。 分包加载数据,只有在主包调用分包某一个页面时候才会调用加载分包。即就是按需加载。 整个小程序不能超过20M&a…

golang grpc进阶

protobuf 官方文档 基本数据类型 .proto TypeNotesGo Typedoublefloat64floatfloat32int32使用变长编码,对于负值的效率很低,如果你的域有可能有负值,请使用sint64替代int32uint32使用变长编码uint32uint64使用变长编码uint64sint32使用变长…

滚柱导轨适配技巧与注意事项!

滚柱导轨是一种重要的传动元件,它由滚柱作为滚动体。用于连接机床的运动部件和床身基座,其设计旨在提供高承载能力和高刚度,适用于重型机床和精密仪器,而滚柱导轨的适配方法对于确保机械设备的高精度运行至关重要。 滚柱导轨的适配…

大数据分析案例-基于逻辑回归算法构建抑郁非抑郁推文识别模型

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集

介绍Java

Java简介 Java是一门由Sun公司(现被Oracle收购)在1995年开发的计算机编程语言,其主力开发人员是James Gosling,被称为Java之父。Java在被命名为“Java”之前,实际上叫做Oak,这个名字源于James Gosling望向…

Unite Barcelona主题演讲回顾:深入了解 Unity 6

本周,来自世界各地的 Unity 开发者齐聚西班牙巴塞罗那,参加 Unite 2024。本次大会的主题演讲持续了一个多小时,涵盖新功能的介绍、开发者成功案例的分享,以及在编辑器中进行的技术演示,重点展示了 Unity 6 在实际项目中…

学习python自动化——pytest单元测试框架

一、什么是pytest 单元测试框架,unittest(python自带的),pytest(第三方库)。 用于编写测试用例、收集用例、执行用例、生成测试结果文件(html、xml) 1.1、安装pytest pip instal…

Spring AI 介绍与入门使用 -- 一个Java版Langchain

Langchain 是什么? Langchain 是一个Python 的AI开发框架,它集成了模型输入输出、检索、链式调用、内存记忆(Memory)、Agents以及回调函数等功能模块。通过这些模块的协同工作,它能够支持复杂的对话场景和任务执行流程…

C语言 | Leetcode C语言题解之第460题LFU缓存

题目: 题解: /* 数值链表的节点定义。 */ typedef struct ValueListNode_s {int key;int value;int counter;struct ValueListNode_s *prev;struct ValueListNode_s *next; } ValueListNode;/* 计数链表的节点定义。 其中,head是数值链表的头…

多点低压差分(M-LVDS)线路驱动器和接收器——MS2111

MS2111 是多点低压差分 (M-LVDS) 线路驱动器和接收器。经过 优化,可运行在高达 200Mbps 的信号速率下。所有部件均符合 M LVDS 标准 TIA / EIA-899 。该驱动器的输出支持负载低至 30Ω 的多 点总线。 MS2111 的接收器属于 Type-2 , 可在 -1…

【GESP】C++一级练习BCQM3037,简单计算,国庆七天乐收官

又回到了简单计算的题目,继续巩固练习。 题解详见:https://www.coderli.com/gesp-1-bcqm3037/ 【GESP】C一级练习BCQM3037,简单计算,国庆七天乐收官 | OneCoder又回到了简单计算的题目,继续巩固练习。https://www.cod…

性能测试工具locust —— Python脚本参数化!

1.1.登录用户参数化 在测试过程中,经常会涉及到需要用不同的用户登录操作,可以采用队列的方式,对登录的用户进行参数化。如果数据要保证不重复,则取完不再放回;如可以重复,则取出后再返回队列。 def lo…

std::future::then的概念和使用方法

std::future::then是 C 中用于异步操作的一种机制,它允许在一个异步任务完成后,接着执行另一个操作(即延续操作)。以下是关于 std::future::then 的概念和使用方法: 1. 概念: std::future::then 的主要目…

Chrome清除nslookup解析记录 - 强制http访问 - 如何禁止chrome 强制跳转https

步骤: 地址栏输入 chrome://net-internals/#hsts在Delete domain 栏的输入框中输入要http访问的域名,然后点击“delete”按钮最后在Query domain 栏中搜索刚才输入的域名,点击“query”按钮后如果提示“Not found”即可! 办法来自…