记录一下亿级别数据入库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.mfbz.cn/a/275732.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库系统原理例题之——SQL 与关系数据库基本操作

SQL 与关系数据库基本操作 第四章 SQL 与关系数据库基本操作【例题】一 、单选题二 、填空题三 、简答题四 、设计题 【答案&解析】一、单选题二、填空题三、简答题四、设计题 【延伸知识点】【延伸知识点答案&解析】 第四章 SQL 与关系数据库基本操作 【例题】 一 、…

视频美颜SDK趋势畅想:未来发展方向与应用场景

当下,视频美颜SDK正不断演进,本文将深入探讨视频美颜SDK的发展趋势,探讨未来可能的方向和广泛的应用场景。 1.深度学习与视频美颜的融合 未来,我们可以期待看到更多基于深度学习算法的视频美颜SDK,为用户提供更高质量…

国标标准和行业标准使用介绍

场景 我现在所在行业是交通行业,主要做城市交通信控相关的工作,后续可能会涉及高速、收费站、稽核收费等业务场景在做产品开发时,我们需要有一个标准可以参考,这些标准必须是公认的,这时就用到了 国家标准、行业标准等…

Python流星雨完整代码

文章目录 环境需求完整代码详细分析环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.net/arti…

企业数据可视化-亿发数据化管理平台提供商,实现一站式数字化运营

近些年来,国内企业数据化管理升级进程持续加速,以物联网建设、人工智能、大数据和5G网络等新技术的发展,推动了数字经济的蓬勃发展,成为维持经济持续稳定增长的重要引擎。如今许多国内中小型企业纷纷摒弃传统管理模式,…

linux基础开发工具使用

文章目录 一. yum命令yum的使用 二.vim命令(写代码)各模式的互相转化命令模式光标移动的命令复制,粘贴,剪切,撤销撤销字符的转换字符的添加和删除查找注释清除注释 替换模式视图模式 裸的vim也可支持多文本编译vim 报错…

Cookie的详解使用(创建,获取,销毁)

文章目录 Cookie的详解使用(创建,获取,销毁)1、Cookie是什么2、cookie的常用方法3、cookie的构造和获取代码演示SetCookieServlet.javaGetCookieServlet.javaweb.xml运行结果如下 4、Cookie的销毁DestoryCookieServletweb.xml运行…

docker学习(十九、network使用示例bridge)

文章目录 一、容器网络分配情况1.启动容器2.查看容器的network3.容器网络分配 二、bridge1.bridge详细介绍2.实践bridge两两匹配3.创建network,默认bridge network相关内容: docker学习(十八、network介绍) docker学习&#xff08…

浅学Vue3

安装 vue项目 npm init vuelatest 回车装包 npm install 路由 安装 Router npm install vue-router4 -S项目根目录新建 router --> index.js vue2中 index.jsimport Vue from vue; import VueRouter from vue-router; import Home from ../views/Home.vue;Vue.use(V…

Linux操作系统极速入门[常用指令](安装jdk,MySQL,nginx),以及在linux对项目进行部署。

linux概述: Linux是一套免费使用和自由传播的操作系统 我们为什么要学,Linux? 主流操作系统: linux系统版本: 内核版: 由linux核心团队开发,维护 免费,开源 负责控制硬件 发行版&…

Vulnhub-Al-Web-1.0 靶机复现完整过程

一、信息收集 1.主机发现 arp-scan -l2.端口扫描 nmap -sV -p- 192.168.200.16PORTSTATESERVICEVERSIONMAC Address80/TCPOpenhttpApache httpd00:0C:29:C4:1B:78 (VMware) 3.目录扫描 python dirsearch.py -u http://192.168.200.16扫描出来这两个文件,首先先…

关于SQL时间盲注(基于sleep函数)的手动测试、burpsuite爆破、sqlmap全自动化注入

SQL时间注入是一种常见的SQL注入攻击方式,攻击者通过在SQL语句中注入时间相关的代码,来获取敏感信息或者执行非法操作。其基本原理如下: 攻击者向Web应用程序中输入一段恶意代码,通过SQL语句查询数据库,并注入时间相关…

【论文阅读】Resource Allocation for Text Semantic Communications

这是一篇关于语义通信中资源分配的论文。全文共5页,篇幅较短。 目录在这里 摘要关键字引言语义通信资源分配贡献公式符号 系统模型DeepSC TransmitterTransmission ModelDeepSC Receiver 语义感知资源分配策略Semantic Spectral Efficiency (S-SE&#…

ClickHouse基础知识(二):ClickHouse 安装教程

1. 准备工作 1.1 确定防火墙处于关闭状态 1.2 CentOS 取消打开文件数限制 (1)在 hadoop101 的 /etc/security/limits.conf 文件的末尾加入以下内容 sudo vim /etc/security/limits.conf(2)在 hadoop101 的/etc/security/limits.…

主编夜话,2023 技术圈儿大事件盘点丨 RTE 开发者日报 Vol.115

开发者朋友们大家好: 这里是「 RTE 开发者日报 」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

netty trojan

参考代码:https://github.com/kdyzm/trojan-client-netty 参考博客: github代码作者的博客:https://blog.kdyzm.cn/post/71 trojan-go介绍:https://p4gefau1t.github.io/trojan-go/developer/trojan/ trojan协议介绍:h…

Python 进阶(十八):配置文件(configparser 模块)

大家好,我是水滴~~ configparser模块是Python标准库中的一个模块,用于解析配置文件。它提供了一种简单而灵活的方式来读取、修改和写入INI格式的配置文件。本文将介绍该模块是如何操作配置文件的。 文章中包含大量的示例代码,希望能够帮助新…

Google Ad帐号被封?这几个关键点看好

海外广告投放工作中,账号是非常重要的环节。与在Facebook上运行广告相比,运行Google Ads在代理选择方面通常没有那么严格,因为 Google 对 IP 使用并不那么严格。但是,这并不意味着您可以不加考虑地使用任何代理IP。在本文中&#…

vue3-富文本编辑器(vue-quill)

官网&#xff1a;VueQuill | Rich Text Editor Component for Vue 3 安装 pnpm add vueup/vue-quilllatest 使用 局部使用 先导包 import { QuillEditor } from vueup/vue-quill import vueup/vue-quill/dist/vue-quill.snow.css; 再使用 <QuillEditor theme"snow…

Arduino中手写脉冲控制步进电机-2

目录 1、前言 2、时间-位移关系计算 3、Matlab计算时间和位置数据 (1)Matlab程序 &#xff08;2&#xff09;Arduino程序 4、Matlab生成Arduino电机正反转程序语句 &#xff08;1&#xff09;Arduino程序 &#xff08;2&#xff09;Matlab 命令行方式生成Arduino步进电…
最新文章