记录一下亿级别数据入库clickhouse

news2025/1/16 7:54:48

需求背景

公司的业务主要是广告数据归因的,每天的pv数据和加粉数据粗粗算一下,一天几千万上亿是有的。由于数据量大,客户在后台查询时间跨度比较大的数据时,查询效率就堪忧。因而将数据聚合后导到clickhouse进行存储,目的只有一个就是加快查询,提高用户体验感。原本以为是个简单的需求,但是在中途还是遇到一些坑。在这里做一个简单的思路分享,后面工作久一些的铁子们应该用的上。

clickhouse文档

文档地址

经验小结第一点

由于清洗历史数据的前期,可能会遇到统计错误,这就涉及到重复清洗的问题。既然需要重复清洗,那么历史数据就需要先删除。在clickhouse的官方文档中,是没有delete的语句的,他的删除语句其实有点像更新语句,严谨来说删除操作其实也是更新的一种。他的SQL语句如下:

 ALTER TABLE 表名 DELETE WHERE + 条件

注意: clickhouse的删除操作不是同步的,而是异步的,并且时间不确定。就是说你在发送这条指令之后,如果后面立即进行新数据的插入,那么大概率的情况下会出现数据错误或者不一致的问题,我分析了一下,当我插入相同时间段的历史数据的时候,这个删除的指令有可能在删除我后面插入的数据,这里是一个大坑,切记!切记!切记!

那么怎么解决呢,如果你的数据比较少或者一天就聚合一两次,那你可以先执行删除的操作,隔一段时间后,再去执行插入的操作,虽然官方文档解释,异步执行的时间不确定,但是只有你在流量比较小的时候去执行,一般没什么问题。

经验小结第二点

因为clickhouse的设计机制中涉及分区的概念,简单理解就是,类似按一定维度去分表,比如按月份分别这种,既然分区,那就涉及到合并数据。在我们日常业务中,由于不可控的因素,偶发性其实出现重复数据是比较常见的问题。但也是一个比较令人痛疼的问题。

考虑到clickhouse删除数据的异步性,加上广告业务,面向B端的客户,数据的实时性也是比较重要的。所以用删除语句去删除再插入,显得就有点不靠谱了,所以下面就需要了解一下clickhouse集中常见的表引擎。

clickhouse官方文档介绍的几种表引擎


下面简单带一下其中的两种,不是说其他的不好,只是这两种我这次分析过,根据自己的业务需求去选择引擎就好。

CollapsingMergeTree

该引擎继承于 MergeTree,并在数据块合并算法中添加了折叠行的逻辑。

CollapsingMergeTree 会异步的删除(折叠)这些除了特定列 Sign 有 1 和 -1 的值以外,其余所有字段的值都相等的成对的行。没有成对的行会被保留。更多的细节请看本文的折叠部分。

因此,该引擎可以显著的降低存储量并提高 SELECT 查询效率。

他的建表语句如下:

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = CollapsingMergeTree(sign)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
CollapsingMergeTree 参数

sign — 类型列的名称: 1 是«状态»行,-1 是«取消»行。列数据类型 — Int8。

解释

这是什么意思呢,我解释一下,其实我个人感觉有点鸡肋,他的意思是你每次插入数据前,都需要插入两次,除了sign字段的值不一样,其他列数据都一样,这样,他在数据合并的过程中,带有-1标识的数据会跟之前的重复的历史数据相互抵消,只保留最新的这一条数据。这就是它处理重复数据的方法,官方的案例是这个样子的:


他这种在特性的场合是可以用的,比如某些数据状态需要经常性更新的时候,是可行的。

官方案例地址:案例地址

但是我没敢用,为什么?

假设我的表初始的时候,是空的,我压根就没有历史数据,那我的这两条数据是不是有可能会相互冲销掉。为此我特地查了一下,结果还真有这种可能性。OMG,算了,这个方式我还是不敢用,不然出问题直接卷铺盖走人。

最终采用的表引擎——ReplacingMergeTree表引擎

借用官方的解释:

该引擎和 MergeTree 的不同之处在于它会删除排序键值相同的重复项。

数据的去重只会在数据合并期间进行。合并会在后台一个不确定的时间进行,因此你无法预先作出计划。有一些数据可能仍未被处理。尽管你可以调用 OPTIMIZE 语句发起计划外的合并,但请不要依靠它,因为 OPTIMIZE 语句会引发对数据的大量读写。

因此,ReplacingMergeTree 适用于在后台清除重复的数据以节省空间,但是它不保证没有重复的数据出现。(这个后续有解决的方式)
这里说的出现重复的数据,其实也是因为它的合并时间是不确定的,不一定马上就合并,所以你查询的时候可能会看到一些重复数据,不过它又提供了一道生门,这个很重要,你可以使用FINAL这个关键字进行查询,SQL语句如下:

slecct * from 表名 [WHERE ...] final

这样查询的时候就是查询最后插入的这条数据。建表语句如下:

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = ReplacingMergeTree([ver])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

expr:这个可以理解成mysql的唯一索引,后面合并数据的时候,它也是以此为依据判断是否是重复数据
举个例子

CREATE TABLE IF NOT EXISTS landing_page_day_statistics
(
    advertiser_account_group_id               bigint comment '项目ID',
    landing_page_id                           bigint comment '落地页ID',
    statistic_date                            timestamp comment '统计日期',
    landing_page_channel_id                   bigint comment '渠道ID',
    page_view_num                             bigint default 0 comment '浏览数',
    created_at                                timestamp
    )
    ENGINE = ReplacingMergeTree() PARTITION BY toYYYYMM(statistic_date)
    PRIMARY KEY (advertiser_account_group_id, landing_page_id, landing_page_channel_id, statistic_date)
    ORDER BY (advertiser_account_group_id, landing_page_id, landing_page_channel_id, statistic_date)
    COMMENT '测试表';

那么在这个引擎下,它就以advertiser_account_group_id, landing_page_id, landing_page_channel_id, statistic_date为唯一键进行判断是否是重复数据,是重复的数据,后续合并的时候就会合并成一条数据。

总结

clickhouse是一个高性能的查询数据库,它的强项在于缩短查询时间,其实严格来说就是用空间换时间。他很强大,但是也需要注意使用的姿势。对于官方文档,一定要多看几遍,看懂了,其实坑就踩平了,当然还有很多其他需要注意的点,后续继续整理给大伙分享一下。

好了,今天的内容就分享到这里,更多内容整理在公众号”安前码后“,一个专注分享使用干货的号,另外最近团队在做"韭盾专栏"号,对财经感兴趣的可以先关注,文章也都是干货,一篇推文一般需要成员花一周的时间去整理和分析。题外话,觉得文章有点小作用,实用的话,帮忙给个三连,感激不尽。
加油,铁子们!!
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Secondo数据库下载安装

SECONDO - An Extensible Database System (secondo-database.github.io) 官网地址 1配置环境 ubuntu20.04.2(这个版本不能错,我试了20.04.3就安装不超过),镜像下载地址如下:Index of /releases/20.04.2 2安装步骤 安…

Springboot使用log4j2日志框架

文章目录 1.pom.xml引入依赖2.配置文件引入log4j2的配置文件3.导入log4j2配置文件4.通过Slf4j注解来使用log.info()等最后 1.pom.xml引入依赖 提示&#xff1a;lombok用于Slf4j注解 <dependency><groupId>org.springframework.boot</groupId><artifactId&…

bat命令清理Window应用注册表(Unity开发Window应用)

bat命令清理Window应用注册表&#xff08;Unity开发Window应用&#xff09; 介绍出现的问题方案一方案二方案二解决方案1. 首先使用【Win】【R】组合快捷键&#xff0c;快速打开运行命令框&#xff0c;在打开后面键入命令&#xff1a;【Regedit】2. 完后后按回车键&#xff08;…

异步通知

文章目录 一、异步通知1、应用场景2、执行流程&#xff08;基于读取按键值的情景&#xff09;2.1、应用程序具体做什么&#xff1f;2.2、驱动程序具体做什么&#xff1f; 三、程序1、驱动程序2、测试应用程序 三、总结 一、异步通知 1、应用场景 当应用程序不想休眠时&#x…

[SWPUCTF 2021 新生赛]sql

[SWPUCTF 2021 新生赛]sql wp 输入 1 正常回显&#xff1a; ?wllm1 返回&#xff1a; Want Me? Cross the Waf Your Login name:xxx Your Password:yyy输入单引号引发报错&#xff1a; ?wllm1 返回&#xff1a; Want Me? Cross the Waf You have an error in your SQL s…

springboot整合minio做文件存储

一,minio介绍 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小&…

《数据结构、算法与应用C++语言描述》- 平衡搜索树 -全网唯一完整详细实现插入和删除操作的模板类

平衡搜索树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_34Balanced search tree 概述 本章会讲AVL、红-黑树、分裂树、B-树。 平衡搜索树的应用&#xff1f; AVL 和红-黑树和分裂树适合内部存储的应用。 B-树适合外部存储的…

一种删除 KubeSphere 中一直卡在 Terminating 的 Namespace--KubeSphere Logging System的简单方法

文章目录 一、问题提出二、删除方法1&#xff0c;获取kubesphere-logging-syste的详细信息json文件2&#xff0c;编辑kubesphere-logging-system.json3&#xff0c;执行清理命令 三、检查结果 一、问题提出 在使用 KubeSphere 的时候发现有一个日志服务KubeSphere Logging Sys…

考研结束,以下事情要抓紧做了!

Hello&#xff0c;大家好&#xff0c;我是 Sunday。 首先恭喜大家考研结束&#xff0c;也在这里祝各位考研的同学们可以 成功上岸 ✿✿ヽ(▽)ノ✿。 不过&#xff0c;考试结束并不是一个终点&#xff0c;而是另外一个新的起点。摆在大家面前的&#xff0c;还有很多新的问题&a…

安卓全球定位系统RTK测量仪 手持GPS北斗定位仪可用于国土电力

RTK&#xff0c;英文全名叫做Real-time kinematic&#xff0c;也就是实时动态。这是一个简称&#xff0c;全称是RTK&#xff08;Real-time kinematic&#xff0c;实时动态&#xff09;载波相位差分技术。 RTK定位是一种高精度的全球卫星导航技术&#xff0c;是实时运用技术&…

系统活动监测:iStat Menus中文 for Mac

iStat Menus是一款功能强大的系统监测和监控软件&#xff0c;可用于 macOS 平台。它提供了实时的系统状态和性能数据&#xff0c;以及各种监控工具和定制选项&#xff0c;帮助用户全面了解和管理他们的计算机系统。 以下是iStat Menus的一些主要特点和功能&#xff1a; 实时系…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第五节 引用类型复制问题及用克隆接口ICloneable修复 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节…

数据库开发之图形化工具以及表操作的详细解析

2.3 图形化工具 2.3.1 介绍 前面我们讲解了DDL中关于数据库操作的SQL语句&#xff0c;在我们编写这些SQL时&#xff0c;都是在命令行当中完成的。大家在练习的时候应该也感受到了&#xff0c;在命令行当中来敲这些SQL语句很不方便&#xff0c;主要的原因有以下 3 点&#xff…

【JavaScript】new原理解析

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

vue3 根据用户权限控制左侧菜单和路由拦截

目录 前言 整体思路 详细开发 1.左侧菜单的显隐控制 2.控制路由权限 补充权限控制 总结 前言 我这里是vue3开发的一个后台管理系统&#xff0c;所以涉及用户权限管理&#xff0c;以及页面权限等&#xff0c;其他模块部分可以查看专栏&#xff0c;这里只对怎么实现根据用…

做亚马逊测评不知道怎么找客户?这才是亚马逊测评的正确打开方式!

如今的跨境电商内卷严重&#xff0c;花费大量资金做广告推广的效果却微乎其微&#xff0c;这也是亚马逊测评迅速崛起的最根本原因。做亚马逊测评是近年来兴起的一种方式&#xff0c;许多卖家都需要大量的测评来提高自己的产品排名和信誉度。很多兄弟最近来问龙哥亚马逊测评怎么…

Mysql For Navicate (老韩)

Navicate创建数据库 先创建一个数据库;然后在数据库中创建一张表;在表格当中填入相应的属性字段;打开表, 然后填入相应的实例字段; – 使用数据库图形化App和使用指令来进行操作各有各的好处和利弊; 数据库的三层结构(破除MySQL神秘) 所谓安装Mysql数据库, 就是在主机安装一…

网工内推 | 网络服务工程师,HCIE认证优先,带薪年假,年终奖

01 高凌信息 招聘岗位&#xff1a;服务工程师&#xff08;珠海&#xff09; 职责描述&#xff1a; 1、负责华为数通&#xff08;交换机、路由器&#xff09;、IT&#xff08;服务器、存储&#xff09;等任一或多个产品领域的项目实施交付&#xff1b; 2、独立完成华为数通&…

搭建FTP服务器与计算机端口介绍

FTP介绍 FTP&#xff08;File Transfer Protocol&#xff09;是一种用于在计算机网络上进行文件传输的协议。它允许用户通过客户端与服务器进行通信&#xff0c;从服务器下载文件或将文件上传到服务器。 FTP使用客户端-服务器模型。用户使用FTP客户端软件连接到FTP服务器&…

常用的 linux 命令

常用的 linux 命令 1.从其他机器拷贝文件夹2.查看哪个程序在用特定端口3.实时监控日志文件内容4.查看指定用户拥有的进程5.查看磁盘空间使用情况6.文件搜索which&#xff08;whereis&#xff09; 显示系统命令所在目录find 查找任何文件或目录1&#xff09; 根据文件名称查找2)…