Clickhouse字典关联外部 MySQL 表联合查询实践

news2024/12/28 20:17:15

前言

clickhouse 可以将源数据加载进 clickhouse 作为字典表使用,字典表可以理解为 clickhouse 中的一张特殊表,我们在查询 clickhouse 表中的数据的时候不需要 JOIN 就可以直接查询字典表中的数据,非常方便,快速。
我刚好在工作场景中遇到了一个非常适合使用 clickhouse 字典表的场景,在这里记录总结下:

  • 我们在 clickhouse 中一张原始数据表 ods_h53_file

    我们对 ods 进行了数据清洗,建模了 dwd 表 dwd_h53_trigger_type

  • 现在外部系统需要查询 ods 表中的数据,但是又需要用到清洗后的 ods 表中的数据,为了对查询速度进行优化不进行 JSON 关联查询,我们使用了 clickhouse 的字典对 dwd_h53_trigger_type进行了缓存生成了一张字典 h53_trigger_type,在查询 ods_h53_file表中的数据时可以直接关联字典 h53_trigger_type查询 dwd 表中的数据。

  • 后边外部系统又需要关联 MySQL 和 clickhouse 表的数据,关联查询 clickhouse ods_h53_file表和 MySQL t_event_package_parse表。

如果不使用 clickhouse 的字典,就需要先从 clickhouse 中查询出对应数据,然后再从 MySQL 过滤查询出对应的数据,最后再在代码内存中进行关联清洗,效率极低,而且很 LOW。

  • 这个时候可以使用 clickhouse 的字典,将外部数据源加载为字典,在查询 clickhouse 表的时候关联查询,效率高,使用简单,极力推荐

创建库

下边的所有 clickhouse SQL 都是在 cloud_data库下执行的,需要先创建库:
create DATABASE cloud_data

创建表

这里对使用到的相关表的创建进行说明,包括 clickhouse 使用到的表: ods_h53_file,dwd_h53_trigger_type,MySQL 使用到的表 t_event_package_parse,以及 clickhouse 中的字典:h53_trigger_type(源数据为clickhouse 内部表), dict_event_package_parse(源数据为 MySQL 外部表)。

注:
如果是在 clickhouse 集群上创建表或字典,需要制定 cluster,例如:
CREATE TABLE cloud_data.ods_h53_file on cluster 集群名称

clickhouse 表 ods_h53_file DDL

CREATE TABLE cloud_data.ods_h53_file (
  `version` String COMMENT '智驾版本,对应config文件中的software_version',
  `trigger_type` String COMMENT '触发类型',
  `vin` String COMMENT '车架号',
  `day_` Date DEFAULT toDate ( timestamp_ / 1000 ) COMMENT '数据时间-天',
  `second_` DateTime DEFAULT toDateTime ( timestamp_ / 1000 ) COMMENT '数据时间-秒',
  `timestamp_` Int64 COMMENT '秒时间戳,对应json中的timestamp',
  `packet_name` String COMMENT '包名',

) ENGINE = MergeTree()
PARTITION BY toYYYYMM(day_)
ORDER BY (vin, day_, second_)
SETTINGS index_granularity = 8192;

clickhouse 表 dwd_h53_trigger_type DDL

create table cloud_data.dwd_h53_trigger_type
(
    `trigger_type` String COMMENT '触发类型',
    `trigger_name` String COMMENT '触发名字',
    `func_type` String COMMENT '事件对应功能'
) ENGINE = MergeTree()
PRIMARY KEY (trigger_type)
ORDER BY
    (trigger_type) SETTINGS index_granularity = 8192 COMMENT 'H53触发器类型';
  • 该表后边会作为源数据创建一张字典,这里的 PRIMARY KEY 很重要,这个是源数据同步至字典的重要字段,而且后边查询字典数据的时候也是通过主键作为过滤条件的。

mysql 表 t_event_package_parse DDL

CREATE TABLE t_event_package_parse (
    id INT AUTO_INCREMENT PRIMARY KEY,
    package_name VARCHAR(255) UNIQUE,
    state ENUM('0', '1', '2'),
    create_time DATETIME,
    create_by VARCHAR(16),
    update_time DATETIME,
    update_by VARCHAR(16)
);

clickhouse 字典 DDL

注:
这里为了测试方便,在创建字典的时候 LIFETIME 设置的时间很短,更新频率较快,时间较短,这样在我们往源表插入数据的时候可以快速同步至字典中。
在实际的生产环境中需要根据具体的业务场景确定,后边会对 LAYOUT 和 LIFETIME 的配置进行说明。

使用 clickhouse 表 dwd_h53_trigger_type 作为数据源创建字典 h53_trigger_type

create DICTIONARY cloud_data.h53_trigger_type
(
    `trigger_type` String,
    `trigger_name` String,
    `func_type` String
) 
PRIMARY KEY trigger_type 
SOURCE(CLICKHOUSE(
  HOST '127.0.0.1'
  PORT 9000
  USER 'root'
  PASSWORD '123456'
  DB 'cloud_data'
  TABLE 'dwd_h53_trigger_type'
  )) 
LAYOUT(COMPLEX_KEY_HASHED()) 
LIFETIME(10);
  • 这里需要注意主键和数据源表保持一致,使用 trigger_type
  • SOURCE配置需要改为 clickhouse 连接信息,需要注意这里的 DB 和 TABLE 不要写错了,这里指的是你需要将哪张表的数据作为源数据。

使用 MySQL 表 t_event_package_parse作为数据源创建字典dict_event_package_parse:

create DICTIONARY cloud_data.dict_event_package_parse
(
    `package_name` String,
    `state` String
) 
PRIMARY KEY package_name 
SOURCE(MYSQL(
  HOST '127.0.0.1'
  PORT 3306
  USER 'root'
  PASSWORD 'password'
  DB 'addcdata'
  TABLE 't_event_package_parse'
  )) 
LAYOUT(COMPLEX_KEY_HASHED()) 
LIFETIME(10);
  • 注意将SOURCE 改为 MYSQL

往 clickhouse 和 MySQL 表中插入测试数据
现在我们往clickhouse 表ods_h53_file,dwd_h53_trigger_type,MySQL 使用到的表 t_event_package_parse中插入几条测试数据:

-- 插入 ods_h53_file
insert into cloud_data.ods_h53_file values('H53A3632801FK', 'RPA中断', 'LDP91C968PE201357', '2024-04-19', '2024-04-19 00:00:00', 1713456000, 'LDP91C968PE201357_20240419224750_A_2');
insert into cloud_data.ods_h53_file values('H53A3632801FK', 'RPA中断2', 'LDP91C968PE201357', '2024-04-20', '2024-04-20 00:00:00', 1713542400, 'LDP91C968PE201357_20240420224750_A_2');
insert into cloud_data.ods_h53_file values('H53A3632801FK', 'RPA中断3', 'LDP91C968PE201357', '2024-04-21', '2024-04-21 00:00:00', 1713628800, 'LDP91C968PE201357_20240421224750_A_2');

-- 插入 dwd_h53_trigger_type
insert into cloud_data.dwd_h53_trigger_type values('RPA', 'RPA中断', 'RPA');

-- 插入 MYSQL 表 t_event_package_parse
INSERT INTO `addcdata`.`t_event_package_parse` (`package_name`, `state`) VALUES ('LDP91C968PE201357_20240420224750_A_2', '0');

插入完后我们验证下字典表中是否已经有数据了:
image.png

联合查询语句

当我们创建好内部字典和外部字典后,我们就可以通过一条 clickhouse SQL 联合查询 clickhouse 与 MySQL 中的数据,并且不需要 JOIN,查询速度快,简单。

SELECT 
       `vin` AS `vin`,
       version, 
       toString(parseDateTimeBestEffort(splitByChar('_', packet_name)[2])) as event_time,
       -- 这一行就是查询内部数据源字典中的数据
       dictGetStringOrDefault('cloud_data.h53_trigger_type', 'trigger_name', trigger_type, trigger_type) AS `func`,
       -- 这一行就是查询外部数据源 MySQL 字典中的数据
       dictGetStringOrDefault('cloud_data.dict_event_package_parse', 'state', packet_name, 0) AS `state`,
       `packet_name` AS `package_name`
FROM `cloud_data`.`ods_h53_file`
WHERE `day_` >= toDate('2024-04-18')
  AND `day_` <= toDate('2024-04-25')
  AND `second_` >= toDateTime('2024-04-18 00:00:00')
  AND `second_` < toDateTime('2024-04-25 00:00:00')
  AND splitByChar('_', packet_name)[3] = 'A'
  AND `vin` = 'LDP91C968PE201357'
  AND func like '%RPA%'
  AND package_name like '%LDP91C968PE201357_20240420224750_A_2%'
GROUP BY `vin`,
         `version`,
         `func`,
         `packet_name`
ORDER BY event_time DESC
LIMIT 1000;
  • 在查询字典中的数据时,不需要 JOIN, 可以直接通过 dict 函数即可,dictGetStringOrDefault 参数说明:字典表,需要查询的字段,主键key, 默认值。

还有许多其他函数可以参考官方文档。
查询结果如下:
image.png

LAYOUT 说明

该配置是说明字典在内存中存储的方式,有许多中,下图是官网的一张截图:
image.png
从上图可以看出有很多种,具体说明可以参考官方文档
关于几种常见的可以看下这篇文章说的还是比较清晰的:
大数据ClickHouse进阶(十八):数据字典类型

LIFETIME 说明

该配置是字典刷新加载源数据的频率,主要有三种使用方式:

  • 直接写入刷新间隔时间,比如 LIFETIME(10) , 10 s 刷新一次, 如果设置为0 代表不会刷新
  • 写入 min 和 max,比如LIFETIME(MIN 300 MAX 360),表示将在300到360s 间随机选择一个时间刷新,在使用分布式 clickhouse 集群时,避免同时大量字典更新导致资源不足,建议使用这种随机的方式,打散刷新频率。
  • 第三种比较高级,在创建字典时指定 invalidate_query 参数控制字典中的数据是否刷新,主要有两种方式:
    • 我们的源表需要有一个类似 update_time 的字段,当源表数据更新时,该字段一定会更新,这样 clickhouse 就知道需要更新字典了。
    • 查询表行数。

注:
但是我在验证第三种方式的时候,不知道为什么没有生效,有验证通过的小伙伴评论或者私信我下,万分感谢。

除了上边的三种配置方式,我们在配置完字典,或者需要立即刷新字典数据时可以通过下边的命令刷新:

# SYSTEM RELOAD DICTIONARY 字典表名
SYSTEM RELOAD DICTIONARY dict_event_package_parse

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

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

相关文章

JavaScript--作用域是什么

作用域是什么 编译原理 在传统的编译语言中&#xff0c;程序中的一段源代码在执行之前会经历三个步骤。成为编译 分词/词法分析 这个过程由字符组成的字符串分解成有意义的代码块&#xff0c;这些代码块成为词法单元。 分词和词法分析之间的主要差异在于词法单元的识别是有…

知识点总结

1、Uboot的流程调用&#xff1a; 1.1、cmd_process函数是怎么被调用到的&#xff1a; cmd_process在common/command.c 1.2、uboot阶段断电&#xff0c;后续起不来&#xff0c;可能要换线去使用&#xff0c;也许和电源线有关 2、git 相关使用 2.1 .gitignore相关的使用 1、…

北京证券公司港股通交易佣金手续费最低是多少?万0.8?港股通纳入规则是怎么样的?

港股通交易佣金概述 港股通的交易佣金可能会因证券公司和投资者的不同而有所差异。 北京证券公司的港股通交易佣金最低可能万分之零点八&#xff08;0.008%&#xff09;&#xff0c;但这需要投资者与证券公司客户经理了解&#xff0c;进行沟通和申请。 一般来说&#xff0c;…

我手握多篇顶会一作,引用量几百,却连个像样的博士offer都申请不到

卷&#xff0c;卷&#xff0c;卷。在当下整个 AI 领域&#xff0c;一切价值衡量标准仿佛都在经历一场恶性的通货膨胀…… 让我们想象这样一个角色&#xff1a; 一个来自普通家庭的学生刻苦努力的完成了自己的学业。他在领域内的顶级会议中发表了多篇论文&#xff0c;并且其论文…

OpenHarmony应用开启Service以及完成自启动和常驻

一.背景 由于有需求实现一个后台常驻服务,这里就是来实现在鸿蒙里面如何实现后台服务并且实现自启动和常驻 二.添加服务 如下来添加服务 然后此时直接运行这个hap是报错的,如下: 此处参考: 应用中添加ServiceExtensionAbility然后安装HAP时提示“code:9568344 error: inst…

【NumPy】全面解析NumPy的bitwise_xor函数:高效按位异或操作指南

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

I.MX6ULL主频和时钟配置实验

系列文章目录 I.MX6ULL主频和时钟配置实验 I.MX6ULL主频和时钟配置实验 系列文章目录一、前言二、I.MX6U 时钟系统详解三、硬件原理四、 7 路 PLL 时钟源五、时钟树简介六、内核时钟设置七、PFD 时钟设置八、AHB、IPG 和 PERCLK 根时钟设置九、实验程序编写十、编译下载10.1编写…

探索Python中的随机数生成与统计分析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、随机数的魅力与实用性 1. 随机数生成基础 2. 批量生成随机数 二、随机数的高级应用&a…

Linux——Linux服务管理

服务管理大作业要求&#xff1a; 基本拓扑如下&#xff1a; 按照要求完成基本的系统管理任务&#xff1a; 完成所有系统的主机名、网络配置&#xff1b; 本次作业共需要3台虚拟机&#xff0c;分别作为客户端、综合应用服务器、存储服务器。三台虚拟机操作系统均为CentOS-Stream…

mybatis新增到数据库后返回当前ID

描述 在开发中&#xff0c;插入一条数据并返回当前的ID的场景很多 之前用mybatisPlus自带的api非常简单&#xff0c;调用完save or insert之后再getId即可。 今天使用mybatis的时候也遇到了这个场景&#xff0c;在此记录一下。 解决问题 直接再insert标签里面表明属性 核心…

软考案例题总结

数据库故障与恢复 E-R图 关系规范化 SQL 涉及的知识点一般包括&#xff1a;表的创建、视图和索引创建的关键字、表的查询、聚集函数、子查询、分组查询、集合操作、外连接存储过程、游标、触发器以及表的更新、插入和删除

WPS PPT学习笔记 2 结构页的制作

制作PPT结构页 制作封面页、目录页、封底页。它们都属于结构页。而时间轴页&#xff0c;流程图页&#xff0c;框架图页这些属于内容页。 做一份PPT 讲一个故事 封面页 开头&#xff0c; 目录页 脉络&#xff0c; 各式内容页 详情&#xff0c; 封底页 结尾。 所有的结构页…

Docker安装OnlyOffice

工作需要&#xff0c;多人在线编辑同一文档&#xff0c;找了一圈发现onlyoffice满足需求&#xff0c;于是使用docker安装了社区版本。下面记录下安装过程。 Onlyoffice 是什么&#xff1f; Onlyoffice 是一个多端协同的 Office 办公套件&#xff0c;相当于微软的 Office365 全…

jenkins+sonarqube部署与配置过程

1、部署jenkins&#xff08;本文不做说明&#xff09; 2、部署sonarqube(docker-compose) version: "2.1"services:sonarqube:image: sonarqube:9.9.4-communitycontainer_name: sonarqubedepends_on:- dbports:- 9000:9000networks:- sonarnetenvironment:SONARQU…

前端学习--React部分

文章目录 前端学习--React部分前言1.React简介1.1React的特点1.2引入文件1.3JSX&#x1f349;JSX简介与使用&#x1f349;JSX语法规则 1.4模块与组件&#x1f349;模块&#x1f349;组件 1.5安装开发者工具 2.React面向组件编程2.1创建组件&#x1f349;函数式组件&#x1f349…

菜鸟的JavaSE学习之旅5

这是一个目录 面向对象类和对象类对象类的定义一个对象的内存成员变量和局部变量定义位置不同作用范围不同默认值不同内存位置不同生命周期不同 关键字this关键字 构造方法标准的类 面向对象 当需要实现一个功能的时候&#xff0c;不关心具体的步骤&#xff0c;而是找一个具有…

前端canvas实现图片涂鸦(Vue2、Vue3都支持)

先看一下效果图吧 代码组成&#xff1a;画笔大小、颜色、工具按钮都是组件&#xff0c;通俗易懂&#xff0c;可以按照自己的需求调整。 主要代码App.vue <template><div class"page"><div class"main"><div id"canvas_panel&qu…

RedHat9 | DNS剖析-DNS服务器综合部署

一、配置需求及网络拓扑 1、配置拓扑 2、配置需求 使用【主DNS服务器】管理meaauf.cn域和gz.meaauf.cn域&#xff1b;并将bj.meaauf.cn域委派给【子域DNS服务器】进行管理。在【主DNS服务器】上添加相应的A记录、别名记录、MX记录和PTR记录&#xff1a;【辅助DNS服务器】作为…

乡村振兴的实践与探索:以生态优先、绿色发展为导向,推动农村人居环境整治,建设美丽宜居乡村

一、引言 随着我国经济社会的快速发展&#xff0c;乡村振兴成为了新时代的重要战略。在这一背景下&#xff0c;以生态优先、绿色发展为导向的乡村振兴模式成为了重要的实践方向。本文旨在探讨如何通过生态优先、绿色发展的理念&#xff0c;推动农村人居环境整治&#xff0c;建…

FL Studio v21.2.3.4004中文破解版百度网盘下载

FL Studio v21.2.3.4004中文破解版是一款完整的软件音乐制作环境或数字音频工作站 (DAW)。代表了超过 18 年的创新发展&#xff0c;它在一个软件包中提供了您创作、编曲、录制、编辑、混音和掌握专业品质音乐所需的一切。FL Studio v21.2.3.4004中文破解版现在是世界上最受欢迎…