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

需求背景

公司的业务主要是广告数据归因的,每天的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.hqwc.cn/news/305531.html

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

相关文章

pybullet安装时出现fatal error C1083: 无法打开包括文件: “string.h”: No such file or directory

pybullet安装时出现fatal error C1083: 无法打开包括文件: “string.h”: No such file or directory 报错原文: -----CloneTreeCreator.cppD:\Program_Professional\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.38.33130\include\cstring(11): fat…

用C语言写爬虫程序采集美图录图片

最近有个公司找我,说他们在某图库充值会员,想要使用里面的图片,而是是海量,问我有没有办法做个筛选并下载保存,成了给我包个大红包。这事有啥难得,以我现在的专业知识储备,这种事情分分钟就解决…

打开相机失败 出现错误的原因

如何解决? Debug中缺少DLL文件 以下参考周姐文档 相机调用步骤 学习相机第三方库的安装 https://blog.csdn.net/Qingshan_z/article/details/117257136书签:QT添加库(静态库和动态库)_Qingshan_z的博客-CSDN博客_qt添加库 添加文…

九九乘法表c 语言 用于打印九九乘法表

以下是一个简单的C语言程序&#xff0c;用于打印九九乘法表&#xff1a; #include <stdio.h>int main() {int i, j;for (i 1; i < 9; i) {for (j 1; j < i; j) {printf("%d*%d%-2d ", j, i, i*j);}printf("\n");}return 0; }解释&#xff1…

java设计模式学习之【迭代器模式】

文章目录 引言迭代器模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用迭代器示例代码地址 引言 想象一下&#xff0c;你在一个书店里浏览各种书籍。你可能会从头到尾查看每一本书&#xff0c;或者可能跳过一些不感兴趣的部分。在这个过程中&#xff0c;你实…

亚马逊多店铺怎么解决后台绑卡付店铺月租?

一、如何解决亚马逊后台绑卡付店铺月租费的问题呢&#xff1f; 在亚马逊开很多店的玩法&#xff0c;是如何有那么多的实体卡去绑定后台扣月租的呢&#xff1f; 做日亚、美亚店群模式的这种玩法是如何解决亚马逊后台交月租费的问题呢&#xff1f; 其实很简单&#xff0c;他们…

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…

AI时代下,如何看待“算法利维坦”?

ChatGPT的浪潮从2022年袭来后&#xff0c;至今热度不减&#xff0c;呈现出蓬勃发展的趋势。AI家居、医疗、教育、金融、公益、农业、艺术…AI真的已经走进了生活的方方面面&#xff0c;我们仿佛已经进入了AI时代&#xff0c;势不可挡。人工智能水平如此之高&#xff0c;不禁感慨…

仪表盘、数据分析新增分享功能及应用服务下新增服务实例菜单

近期&#xff0c;博睿数据根据一体化智能可观测平台 Bonree ONE 产品本身&#xff0c;以及用户反馈进行持续的更新和优化。以下为 Bonree ONE 产品功能更新报告第03期内容&#xff0c;更多探索&#xff0c;未完待续。 本次迭代的更新集中在平台的仪表盘、数据分析新增分享功能&…

Ubuntu18.04安装GTSAM库并验证GTSAM是否安装成功(亲测可用)

在SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;和SFM&#xff08;Structure from Motion&#xff09;这些复杂的估计问题中&#xff0c;因子图算法以其高效和灵活性而脱颖而出&#xff0c;成为图模型领域的核心技术。GTSAM&#xff08;Georgia Tech Smo…

【CSS】基础知识梳理和总结

1. 前言 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;&#xff0c;用来为HTML文档添加样式的计算机语言。HTML中加载样式的方法有三种&#xff1a; 通过<link>标签加载外部样式表&#xff08;External Style Sheet&#xff09;&#xff0c…

腾讯云服务器如何买(购买腾讯云服务器的详细步骤)

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是…