从入门到放弃之「ClickHouse」

文章目录

    • 1. 写在最前面
      • 1.1 思路
    • 2. ClickHouse
      • 2.1 基本概念
      • 2.2 高端用法
        • 2.2.1 条件判断
        • 2.2.2 HAVING
        • 2.2.3 CASE WHEN
        • 2.2.4 window function
    • 3. 碎碎念
    • 4. 参考资料

1. 写在最前面

最近在整理 api 成功率的问题。但是总结下来以下三点是我分析路上的绊脚石。

  • 上报链路还不够稳定,所以最终实时计算产生的指标是会有所丢失的。

  • 数据存储使用的是 ClickHouse ,而我对这个数据库的「高端」用法一无所知。

  • 需要在有限的时间里,完成对大概 200 多个客户的成功率的分析。

注:此处的「高端」指从数据库小白的角度

1.1 思路

  • 「链路数据上报丢失的问题」

    • 丢失具体随机性,一方面可以跟责任方沟通是否可以优化上报链路的可用性,另一方可以将丢失的点从成功率的计算中过滤出去。
  • 「200 多个客户的成功率分析」

    • 采用抓大放小的原则,优先对请求量在一定数量级的客户进行分析。

    • 对于请求量较小的客户,可以先协商是否可以延期交付

注:「当老板交代你完成一件事情的时候,你第一反应不应该是拒绝,而应该是我先出一份整体的完成思路,请老板帮忙评估一下是否符合交付目标」(ps:论把一件事件完成的符合老板的 N 种想法

2. ClickHouse

2.1 基本概念

ClickHouse 是一个开源的分布式数据库管理系统,用于在线分析处理 (OLAP),它是由俄罗斯搜索引擎公司 Yandex 开发的,并于 2016 年开源发布。

ClickHouse 支持高性能数据压缩和并行查询处理,可以在大规模数据集上快速执行复杂的分析查询,它的主要特点包括:

  • 高性能:可以以每秒百万级别的查询速度处理大型数据集,适用于需要快速响应分析查询的应用场景。

  • 可扩容:支持横向扩容,可以通过添加更多的节点来处理更大的数据集和更高的查询负载。

  • 列式存储: 使用列式存储结构,将同一列的数据连续存储在磁盘上,这种存储结构使得它在进行聚合和过滤操作的时非常高效。

  • 数据压缩:支持多种数据压缩算法,可以大幅减少数据的存储空间,同时不影响查询性能。

  • SQL 支持:支持标准的 SQL 查询语言,可以通过简单的 SQL 语句进行分析查询。

2.2 高端用法

2.2.1 条件判断
SELECT if(cond, then, else)

如果条件 cond 的计算结果为非零值,则返回表达式 then 的结果,并跳过表达式 else 的结果。如果 cond 为零或 NULL,则将跳过 then 表达式的结果,并返回 else 表达式的结构。

成功率计算使用举例:

 sum(if(error_code in(200), response_cnt, 0))/sum(response_cnt) 
2.2.2 HAVING

允许过滤由 GROUP BY 生成的聚合结果。它类似于 WHERE,但是不同的事 WHERE 是在聚合之前执行的,而 HAVING 之后执行。

注:限制,HAVING 如果不执行聚合则无法使用。

过滤请求量低的使用举例:

HAVING sum(req_cnt) > 2
2.2.3 CASE WHEN
  • ClickHouse中的CASE WHEN用法与SQL标准中的用法基本相同,用于实现条件分支逻辑

  • CASE WHEN的基本语法如下:

    CASE [expression]WHEN condition_1 THEN result_1WHEN condition_2 THEN result_2...WHEN condition_n THEN result_n[ELSE else_result]
    END
    

阈值调参使用举例:

 case when req_succ_cnt/req_total_cnt < 0.9 then ts else null end
2.2.4 window function

语法:

aggregate_function (column_name)OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column] [ROWS or RANGE expression_to_bound_rows_withing_the_group]] | [window_name])
FROM table_name
WINDOW window_name as ([[PARTITION BY grouping_column] [ORDER BY sorting_column])
  • PARTITION BY - defines how to break a resultset into groups.
  • ORDER BY - defines how to order rows inside the group during calculation aggregate_function.
  • ROWS or RANGE - defines bounds of a frame, aggregate_function is calculated within a frame.
  • WINDOW - allows to reuse a window definition with multiple expressions.

五分钟维度聚合窗口阈值分析举例:

sum(req_total_cnt) over (partition by id order by ts range between 240 preceding and current row) as req_total_cnt

这个比较复杂,详细的分析语法如下:

以上语句是一个 ClickHouse 查询语句,用于计算在每个 ID 分组下,从当前行往前推 240 个范围内的请求总数。

具体解释如下:

  • sum(req_total_cnt):这是一个聚合函数,计算前面定义的req_total_cnt列中的值的总和。
  • over:这是一个窗口函数,它允许在聚合函数的基础上执行额外的操作。它指定在给定窗口范围内执行聚合函数。
  • partition by id:这是一个窗口分区子句,它定义了按照id列进行分组,即针对每个不同的id值执行聚合计算。
  • order by ts:这是一个窗口排序子句,它根据ts列的值对数据进行排序。窗口函数将按照此顺序计算。
  • range between 240 preceding and current row:这是一个窗口范围子句,它指定了窗口的范围,「240 preceding」表示从当前行往前推240行,「current row」表示当前行。

3. 碎碎念

ClickHouse 「高端」的语法其实还有很多,但无奈这波流感的威力实在是太强了,感觉中招之后,就很难受,不写了,我要继续吃颗退烧药了。

  • i was looking for a person who would encourage me support me inspire me keep me focused make me happy and give me unconditional love then i really that all along that person was myself

  • 诞生降世的意义,就是为了采集这个世界中美丽的事物啊!

  • 他很辛苦,所以要给他高温补贴,高工资,防中暑物资,不拖欠工资,而不是来教育我们不要抱怨生活。

4. 参考资料

  • 条件函数

  • HAVING 子句

  • ClickHouse的case when用法,及利用它实现按条件统计数量_clickhouse统计

  • Window Functions

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

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

相关文章

java 自用工具方法

java 自用工具方法 时间格式转换1 将时间转换成指定格式的字符串校验1.国内手机校验2.邮箱校验3.国内身份证校验4.性别校验5.字符串组是否包含字符串 【完全包含,不区分大小写】字符串其它应用1.字符串指定截取时间格式转换 1 将时间转换成指定格式的字符串 // date 时间 fo…

1-交易系统设计的一些原则

高并发原则 无状态 如果设计的应用是无状态的&#xff0c;那么应用比较容易进行水平扩展。实际生产环境可能是这样的&#xff1a;应用无状态&#xff0c;配置文件有状态。比如&#xff0c;不同的机房需要读取不同的数据源&#xff0c;此时&#xff0c;就需要通过配置文件或配…

Python(四十九)——requests和httpx

Python(四十九)——requests和httpx Python——requests和httpx获取cookie Python(四十九)——requests和httpx 1. 获取cookies1.1 requests获取cookies1.1.1 直接获取cookies1.1.2 session 获取cookies 1.2 httpx获取cookie1.3 获取Set-Cookie1.4 cookie 失效1.5 获取cookie的…

CEC2013(python):五种算法(GA、WOA、GWO、DBO、HHO)求解CEC2013(python代码)

一、五种算法简介 1、遗传算法算法GA 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、蜣螂优化算法DBO 5、哈里斯鹰优化算法HHO 二、5种算法求解CEC2013 &#xff08;1&#xff09;CEC2013简介 参考文献&#xff1a; [1] Liang J J , Qu B Y , Suganthan P N , et al. Prob…

3D模型如何制作透明玻璃材质

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 1、什么是玻璃材质 在3D建模和渲染中&#xff0c;玻璃是一种非常常见…

Keras使用sklearn中的交叉验证和网格搜索

Keras是Python在深度学习领域非常受欢迎的第三方库&#xff0c;但Keras的侧重点是深度学习&#xff0c;而不是所以的机器学习。事实上&#xff0c;Keras力求极简主义&#xff0c;只专注于快速、简单地定义和构建深度学习模型所需要的内容。Python中的scikit-learn是非常受欢迎的…

【单调栈】LeetCode2030:含特定字母的最小子序列

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调栈 题目 给你一个字符串 s &#xff0c;一个整数 k &#xff0c;一个字母 letter 以及另一个整数 repetition 。 返回 s 中长度为 k 且 字典序最小 的子序列&#xff0c;该子序列同时应满足字母 letter 出…

SpringMVC01

SpringMVC 1. 学习⽬标2. 什么叫MVC&#xff1f;3. SpringMVC 框架概念与特点4. SpringMVC 请求流程5. Spring MVC 环境搭建6. URL 地址映射配置7. 参数绑定8. JSON 数据开发JSON普通数组步骤1:pom.xml添加依赖步骤2&#xff1a; 修改配置⽂件步骤3. 注解使⽤ 1. 学习⽬标 2. 什…

【介质】DWPD 每日整盘写入次数 衡量SSD固态硬盘寿命

SSD DWPD什么意思? 经常看到厂商发布的SSD产品有DWPD这个指标&#xff0c;DWPD是什么意思&#xff1f; DWPD DWPD,&#xff08;Diskful Writes Per Day&#xff09;&#xff0c;每日整盘写入次数&#xff0c;指在预期寿命内可每日完整写入SSD固态硬盘所有容量的次数。 也有…

树莓派,opencv,Picamera2利用舵机云台追踪特定颜色对象(PID控制)

一、需要准备的硬件 Raspiberry 4b两个SG90 180度舵机&#xff08;注意舵机的角度&#xff0c;最好是180度且带限位的&#xff0c;切勿选360度舵机&#xff09;二自由度舵机云台&#xff08;如下图&#xff09;Raspiberry CSI 摄像头 组装后的效果&#xff1a; 二、项目目标…

Python 中如何编写类型提示

哈喽大家好&#xff0c;我是咸鱼 我们知道 Python 是一门具有动态特性的语言&#xff0c;在编写 Python 代码的时候不需要显式地指定变量的类型 这样做虽然方便&#xff0c;但是降低了代码的可阅读性&#xff0c;在后期 review 代码的时候容易对变量的类型产生混淆&#xff0…

解决文件导出过大->java压缩zip文件--封装工具类

阿丹&#xff1a; 在业务逻辑中的数据存在一部分业务场景&#xff0c;在导出文件或者视频的时候需要将文件暂存在服务器上再上传到oss对象存储或者fastdfs中让用户来下载使用。但是出现的问题就是如果目标文件过大&#xff0c;文件的上传云端和下载本地就会时间拉长&#xff0c…

使用python读取EXCEL放假日历并制作订阅文件

前言 不想升级IOS&#xff0c;苦于找不到新的日历订阅url&#xff0c;小菜鸡百度来百度去发现ics这东西可以自己做一个&#xff0c;惊喜于看到了这篇文章--使用python获取日历信息并制作订阅文件_https: //github.com/lk-itween/calendar-CSDN博客 感谢作者大大。就想自己写一…

滑动窗口双指针

力扣 209 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 类似窗口滑动 j代表的是窗口的结束位置 i表示开始位置 在while循环中是寻找最…

服务器数据恢复-昆腾存储StorNext文件系统下raid5数据恢复案例

服务器数据恢复环境&#xff1a; 昆腾某型号存储&#xff0c;StorNext文件存储系统。 共有9个分别配置了24块磁盘的磁盘柜&#xff0c;其中8个磁盘柜存放普通数据&#xff0c;1个磁盘柜存放元数据。 存放元数据的磁盘柜中的24块磁盘组建了8组RAID1阵列和1组4盘RAID10阵列&#…

NCV8460ADR2G在汽车和工业应用中高压侧驱动如何破?

NCV8460ADR2G是一款完全保护的高压侧驱动器&#xff0c;可用于开关各种负载&#xff0c;如灯泡、电磁阀和其他致动器。该器件可以通过有源电流限制和高温关断针对过载情况进行内部保护。 诊断状态输出引脚提供了高温以及开关状态开路负载情况的数字故障指示。 特性&#xff1a;…

Nginx的location路径与proxy_pass匹配规则

location路径与proxy_pass匹配规则 路径替换总结当访问地址是 http://127.0.0.1/api/user/list注意:location后斜杆与proxy_pass后斜杆"/"问题&#xff0c;最好要么两者都加斜杆&#xff0c;要么都不加 路径替换 配置proxy_pass时&#xff0c;可以实现URL路径的部分…

22 Vue3中使用v-for遍历对象

概述 使用v-for遍历对象在真实的开发中比较少见&#xff0c;了解即可。 对象我更喜欢统一称之为字典&#xff0c;假如你哪天发现我在某个前端的教程中把对象叫做字典&#xff0c;请你知道这两个是同一个玩意儿。 所谓字典&#xff0c;就是一种key-value类型的结构的统称。 …

队列(C语言版)

一.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有 先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为 队尾 出队列&#xff1a;进行删除操作的一端称为…

网络安全之Linux环境配置及Linux基础知识讲解<三>

目录 一.下载安装Vmware二.下载安装Kali三.Linux目录结构四.Linux文件属性五.文件目录管理六.vim编辑器 一.下载安装Vmware Vmware官网&#xff1a;https://www.vmware.com 二.下载安装Kali Kali包含数百种工具&#xff0c;可用于各种信息安全任务&#xff0c;例如渗透测试、…