ClickHouse(十八):Clickhouse Integration系列表引擎

 

 进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容!

🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客

📌订阅:拥抱独家专题,你的订阅将点燃我的创作热情!

👍点赞:赞同优秀创作,你的点赞是对我创作最大的认可!

⭐️ 收藏:收藏原创博文,让我们一起打造IT界的荣耀与辉煌!

✏️评论:留下心声墨迹,你的评论将是我努力改进的方向!


目录

1. HDFS

1.1 语法

1.2 其他配置

1.3 示例

​​​​​​​​​​​​​​2. MySQL

2.1 语法

2.2 示例

2.3 测试 replace_query  

2.4 测试 on_duplicate_clause

​​​​​​​​​​​​​​3. Kafka

3.1 语法

3.2 示例

3.3 示例


ClickHouse提供了许多与外部系统集成的方法,包括一些表引擎。这些表引擎与其他类型的表引擎类似,可以用于将外部数据导入到ClickHouse中,或者在ClickHouse中直接操作外部数据源。

​​​​​​​1. HDFS

HDFS引擎支持ClickHouse 直接读取HDFS中特定格式的数据文件,目前文件格式支持Json,Csv文件等,ClickHouse通过HDFS引擎建立的表,不会在ClickHouse中产生数据,读取的是HDFS中的数据,将HDFS中的数据映射成ClickHouse中的一张表,这样就可以使用SQL操作HDFS中的数据。

ClickHouse并不能够删除HDFS上的数据,当我们在ClickHouse客户端中删除了对应的表,只是删除了表结构,HDFS上的文件并没有被删除,这一点跟Hive的外部表十分相似。

1.1 语法

ENGINE = HDFS(URI, format)

注意:URI是HDFS文件路径,format指定文件格式。HDFS文件路径中文件为多个时,可以指定成some_file_?,或者当数据映射的是HDFS多个文件夹下数据时,可以指定somepath/* 来指定URI

1.2 其他配置

由于HDFS配置了HA 模式,有集群名称,所以URI使用mycluster HDFS集群名称时,ClickHouse不识别,这时需要做以下配置:

  1. 将hadoop路径下$HADOOP_HOME/etc/hadoop下的hdfs-site.xml文件复制到/etc/clickhouse-server目录下。
  2. 修改/etc/init.d/clickhouse-server 文件,加入一行 “export LIBHDFS3_CONF=/etc/clickhouse-server/hdfs-site.xml”
  3. 重启ClickHouse-server 服务

serveice clickhouse-server restart

当然,这里也可以不做以上配置,在写HDFS URI时,直接写成对应的节点+端口即可。

1.3 示例

#在HDFS路径 hdfs://mycluster/ch/路径下,创建多个csv文件,写入一些数据c1.csv文件内容:1,张三,192,李四,20c2.csv文件内容:3,王五,214,马六,22#创建表 t_hdfs,使用HDFS引擎node1 :) create table t_hdfs(id UInt8,name String,age UInt8) engine = HDFS('hdfs://mycluster/ch/*.csv','CSV')#查询表 t_hdfs中的数据node1 :) select * from t_hdfs;┌─id─┬─name─┬─age─┐│  3  │ 王五  │  21 ││  4  │ 马六  │  22 │└────┴──────┴─────┘┌─id─┬─name─┬─age─┐│  1  │ 张三  │  19 ││  2  │ 李四  │  20 │└────┴──────┴─────┘注意:这里表t_hdfs不会在clickhouse对应的节点路径下创建数据目录,同时这种表映射的是HDFS路径中的csv文件,不能插入数据,t_hdfs是只读表。#创建表 t_hdfs2 文件 ,使用HDFS引擎node1 :) create table t_hdfs2(id UInt8,name String,age UInt8) engine = HDFS('hdfs://mycluster/chdata','CSV');#向表 t_hdfs2中写入数据node1 :) insert into t_hdfs2 values(5,'田七',23),(6,'赵八',24);#查询表t_hdfs2中的数据node1 :) select * from t_hdfs2;┌─id─┬─name─┬─age─┐│  5  │ 田七  │  23 ││  6  │  赵八 │  24 │└────┴──────┴─────┘注意:t_hdfs2表没有直接映射已经存在的HDFS文件,这种表允许查询和插入数据。

​​​​​​​​​​​​​​2. MySQL

ClickHouse MySQL数据库引擎可以将MySQL某个库下的表映射到ClickHouse中,使用ClickHouse对数据进行操作。ClickHouse同样支持MySQL表引擎,即映射一张MySQL中的表到ClickHouse中,使用ClickHouse进行数据操作,与MySQL数据库引擎一样,这里映射的表只能做查询和插入操作,不支持删除和更新操作。

2.1 语法

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster](name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],...) ENGINE = MySQL('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause']);
  • 以上语法的解释如下:
  1. host:port - MySQL服务器名称和端口
  2. database - MySQL 数据库。
  3. table - 映射的MySQL中的表
  4. user - 登录mysql的用户名
  5. password - 登录mysql的密码
  6. replace_query  - 将INSERT INTO 查询是否替换为 REPLACE INTO 的标志,默认为0,不替换。当设置为1时,所有的insert into 语句更改为 replace into 语句。当插入的数据有重复主键数据时,此值为0默认报错,此值为1时,主键相同这条数据,默认替换成新插入的数据。
  7. on_duplicate_clause - 默认不使用。当插入数据主键相同时,可以指定只更新某列的数据为新插入的数据,对应于on duplicate key 后面的语句,其他的值保持不变,需要replace_query 设置为0。

2.2 示例

#在mysql 中创建一张表 t_ch,指定id为主键CREATE TABLE t_ch (id INT,NAME VARCHAR (255),age INT,PRIMARY KEY (id))#向表中增加一些数据insert into  t_ch values (1,"张三",18),(2,"李四",19),(3,"王五",20)#在ClickHouse中创建MySQL引擎表 t_mysql_enginenode1 :) create table t_mysql_engine (:-]  id UInt8,:-]  name String,:-]  age UInt8:-] )engine = MySQL('node2:3306','test','t_ch','root','123456');#查询ClickHouse表 t_mysql_engine 中的数据:node1 :) select * from t_mysql_engine;┌─id─┬─name─┬─age─┐│  1  │ 张三  │  18 ││  2  │ 李四  │  19 ││  3  │ 王五  │  20 │└────┴──────┴─────┘#在ClickHouse中向表 t_mysql_engine中插入一条数据node1 :) insert into t_mysql_engine values (4,'马六','21');┌─id─┬─name─┬─age─┐│  1   │ 张三    │  18   ││  2   │ 李四    │  19   ││  3   │ 王五    │   20  ││  4   │ 马六    │  21   │└───┴─────┴───┘#在ClickHouse中向表 t_mysql_engine中再插入一条数据,这里主键重复,报错。node1 :) insert into t_mysql_engine values (4,'田七','22');Exception: mysqlxx::BadQuery: Duplicate entry '4' for key'PRIMARY' (node2:3306).注意:在clickhouse 中 t_mysql_engine表不会在ClickHouse服务器节点上创建数据目录。

2.3 测试 replace_query  

#在mysql 中删除表 t_ch,重新创建,指定id为主键CREATE TABLE t_ch (id INT,NAME VARCHAR (255),age INT,PRIMARY KEY (id))#向表中增加一些数据insert into  t_ch values (1,"张三",18),(2,"李四",19),(3,"王五",20)#在ClickHouse中删除MySQL引擎表 t_mysql_engine,重建node1 :) create table t_mysql_engine (:-]  id UInt8,:-]  name String,:-]  age UInt8:-] )engine = MySQL('node2:3306','test','t_ch','root','123456',1);#查询ClickHouse表 t_mysql_engine 中的数据:node1 :) select * from t_mysql_engine;┌─id─┬─name─┬─age─┐│  1  │ 张三  │  18 ││  2  │ 李四  │  19 ││  3  │ 王五  │  20 │└────┴──────┴─────┘#在ClickHouse中向表 t_mysql_engine中插入一条数据,主键重复。这里由于指定了replace_query = 1 ,所以当前主键数据会被替换成新插入的数据。node1 :) insert into t_mysql_engine values (3,'马六','21');#查询ClichHouse t_mysql_engine表数据node1 :) select * from t_mysql_engine;┌─id─┬─name─┬─age─┐│  1  │ 张三  │  18 ││  2  │ 李四  │  19 ││  3  │ 马六  │  21 │└────┴──────┴─────┘

2.4 测试 on_duplicate_clause

#在mysql 中删除表 t_ch,重新创建,指定id为主键CREATE TABLE t_ch (id INT,NAME VARCHAR (255),age INT,PRIMARY KEY (id))#向表中增加一些数据insert into  t_ch values (1,"张三",18),(2,"李四",19),(3,"王五",20)#在ClickHouse中删除MySQL引擎表 t_mysql_engine,重建node1 :) create table t_mysql_engine (:-]  id UInt8,:-]  name String,:-]  age UInt8:-] )engine = MySQL('node2:3306','test','t_ch','root','123456',0,'update age = values(age)');#查询ClickHouse表 t_mysql_engine 中的数据:node1 :) select * from t_mysql_engine;┌─id─┬─name─┬─age─┐│  1  │ 张三  │  18 ││  2  │ 李四  │  19 ││  3  │ 王五  │  20 │└────┴──────┴─────┘#在ClickHouse 中向表 t_mysql_engine中插入一条数据node1 :) insert into t_mysql_engine values (4,'马六','21');┌─id─┬─name─┬─age─┐│  1   │ 张三    │  18   ││  2   │ 李四    │   19  ││  3   │ 王五    │  20   ││  4   │ 马六    │  21   │└──┴─────┴────┘#在ClickHouse中向表 t_mysql_engine中插入一条数据,主键重复。node1 :) insert into t_mysql_engine values (4,'田七','100');#查询ClichHouse t_mysql_engine表数据node1 :) select * from t_mysql_engine;┌─id─┬─name─┬─age─┐│  1  │ 张三  │  18 ││  2  │ 李四  │  19 ││  3  │ 王五  │  20 ││  4  │ 马六  │ 100 │└────┴──────┴─────┘

​​​​​​​​​​​​​​3. Kafka

ClickHouse中还可以创建表指定为Kafka为表引擎,这样创建出的表可以查询到Kafka中的流数据。对应创建的表不会将数据存入ClickHouse中,这里这张kafka引擎表相当于一个消费者,消费Kafka中的数据,数据被查询过后,就不会再次被查询到。

3.1 语法

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster](name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],...) ENGINE = Kafka()SETTINGSkafka_broker_list = 'host:port',kafka_topic_list = 'topic1,topic2,...',kafka_group_name = 'group_name',kafka_format = 'data_format'[,]
  • 对以上参数的解释:
  1. kafka_broker_list: 以逗号分隔的Kafka Broker节点列表
  2. kafka_topic_list : topic列表
  3. kafka_group_name : kafka消费者组名称
  4. kafka_format : Kafka中消息的格式,例如:JSONEachRow、CSV等等,具体参照https://clickhouse.tech/docs/en/interfaces/formats/。这里一般使用JSONEachRow格式数据,需要注意的是,json字段名称需要与创建的Kafka引擎表中字段的名称一样,才能正确的映射数据。

3.2 示例

#创建表 t_kafka_consumer ,使用Kafka表引擎node1 :) create table t_kafka_consumer (:-] id UInt8,:-] name String,:-] age UInt8:-] ) engine = Kafka():-] settings:-] kafka_broker_list='node1:9092,node2:9092,node3:9092',:-] kafka_topic_list='ck-topic',:-] kafka_group_name='group1',:-] kafka_format='JSONEachRow';#启动kafka,在kafka中创建ck-topic topic,并向此topic中生产以下数据:创建topic:kafka-topics.sh --zookeeper node3:2181,node4:2181,node5:2181 --create --topic ck-topic --partitions 3 --replication-factor 3生产数据:kafka-console-producer.sh --broker-list node1:9092,node2:9092,node3:9092 --topic ck-topic生产数据如下:{"id":1,"name":"张三","age":18}{"id":2,"name":"李四","age":19}{"id":3,"name":"王五","age":20}{"id":4,"name":"马六","age":21}{"id":5,"name":"田七","age":22}#在ClickHouse中查询表 t_kafka_consumer数据,可以看到生产的数据node1 :) select * from t_kafka_consumer;┌─id─┬─name─┬─age─┐│  2  │ 李四  │  19 ││  5  │ 田七  │  22 ││  1  │ 张三  │  18 ││  4  │ 马六  │  21 ││  3  │ 王五  │  20 │└────┴──────┴─────┘注意:再次查看表 t_kafka_consumer数据 ,我们发现读取不到任何数据,这里对应的ClikcHouse中的Kafka引擎表,只是相当于是消费者,消费读取Kafka中的数据,数据被消费完成之后,不能再次查询到对应的数据。

以上在ClickHouse中创建的Kafka引擎表 t_kafka_consumer 只是一个数据管道,当查询这张表时就是消费Kafka中的数据,数据被消费完成之后,不能再次被读取到。如果想将Kafka中topic中的数据持久化到ClickHouse中,我们可以通过物化视图方式访问Kafka中的数据,可以通过以下三个步骤完成将Kafka中数据持久化到ClickHouse中:

  1. 创建Kafka 引擎表,消费kafka中的数据。
  2. 再创建一张ClickHouse中普通引擎表,这张表面向终端用户查询使用。这里生产环境中经常创建MergeTree家族引擎表。
  3. 创建物化视图,将Kafka引擎表数据实时同步到终端用户查询表中。

3.3 示例

#在ClickHouse中创建 t_kafka_consumer2 表,使用Kafka引擎node1 :) create table t_kafka_consumer2 (:-] id UInt8,:-] name String,:-] age UInt8:-] ) engine = Kafka():-] settings:-] kafka_broker_list='node1:9092,node2:9092,node3:9092',:-] kafka_topic_list='ck-topic',:-] kafka_group_name='group1',:-] kafka_format='JSONEachRow';#在ClickHouse中创建一张终端用户查询使用的表,使用MergeTree引擎node1 :) create table t_kafka_mt(:-] id UInt8,:-] name String,:-] age UInt8:-] ) engine = MergeTree():-] order by id;#创建物化视图,同步表t_kafka_consumer2数据到t_kafka_mt中node1 :) create materialized view  view_consumer to t_kafka_mt:-] as select id,name,age from t_kafka_consumer2;注意:物化视图在ClickHouse中也是存储数据的,create  materialized view  view_consumer to t_kafka_mt 语句是将物化视图view_consumer中的数据存储到到对应的t_kafka_mt 表中,这样同步的目的是如果不想继续同步kafka中的数据,可以直接删除物化视图即可。#向Kafka ck-topic中生产以下数据:生产数据:kafka-console-producer.sh --broker-list node1:9092,node2:9092,node3:9092 --topic ck-topic生产数据如下:{"id":1,"name":"张三","age":18}{"id":2,"name":"李四","age":19}{"id":3,"name":"王五","age":20}{"id":4,"name":"马六","age":21}{"id":5,"name":"田七","age":22}#查询表 t_kafka_mt中的数据,数据同步完成。node1 :) select * from t_kafka_mt;┌─id─┬─name─┬─age─┐│  1  │ 张三  │  18 ││  2  │ 李四  │  19 ││  3  │ 王五  │  20 ││  4  │ 马六  │  21 ││  5  │ 田七  │  22 │└────┴──────┴─────┘

👨‍💻如需博文中的资料请私信博主。


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

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

相关文章

IDEA常用设置与maven项目部署

目录 前言 一、Idea是什么 二、Idea的优点 三、Idea的常用设置 主题设置 设置鼠标悬浮提示 忽略大小写提示 自动导包 取消单行显示Tabs 设置字体 配置类文档注释信息模版 设置文件编码 设置自动编译 水平或者垂直显示代码 快捷方式改成eclipse 设置默认浏览器…

Java并发编程(六)线程池[Executor体系]

概述 在处理大量任务时,重复利用线程可以提高程序执行效率,因此线程池应运而生。 它是一种重用线程的机制,可以有效降低内存资源消耗提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行线程池可以帮助我们更好地管理线程的生命周期和资源使用,…

Jmeter - 函数助手

目录 __StringFromFile __CSVRead __counter __RandomString __StringFromFile StringFromFile函数用于获取文本文件的值,一次读取一行 1、输入文件的全路径:填入文件路径 2、存储结果的变量名(可选) 3、Start file sequence …

Tomcat+Http+Servlet

文章目录 1.HTTP1.1 请求和响应HTTP请求:请求行请求头请求体HTTP响应:响应行(状态行)响应头响应体 2. Apache Tomcat2.1 基本使用2.2 IDEA中创建 Maven Web项目2.3 IDEA中使用Tomcat 3. Servlet3.1 Servlet快速入门3.2 Servlet执行…

游戏中的UI适配

引用参考:感谢GPT UI适配原理以及常用方案 游戏UI适配是确保游戏界面在不同设备上以不同的分辨率、屏幕比例和方向下正常显示的关键任务。下面是一些常见的游戏UI适配方案: 1.分辨率无关像素(Resolution-Independent Pixels)&a…

【广州华锐视点】VR警务教育实训系统模拟真实场景进行实践训练

随着科技的发展,虚拟现实技术在教育领域得到了广泛的应用。VR警务教育实训系统就是其中的一种应用,该系统由广州华锐互动开发,可以模拟真实的警务场景,让学生通过虚拟现实技术进行实践训练,提高学生的实践能力和技能水…

Linux:shell脚本循环语句

目录 一、循环含义 二、echo命令 三、for 3.1.将1到100累加求和 3.2批量添加用户 3.3 根据IP地址检查主机状态 四、 while 和 until 4.1 猜价格 4.2 1-100求和 一、循环含义 循环含义 将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件 重复…

视频汇聚平台EasyCVR视频监控播放平台WebRTC流地址无法播放的问题解决方案

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多…

Ubuntu18.04.4裸机配置

下载虚拟机Ubuntu18.04.4 链接:https://pan.baidu.com/s/1jyucyUSXa9-Fw9ctuU87hA 提取码:o42a –来自百度网盘超级会员V5的分享 VMware选择镜像安装 设置你的用户名,就像windows上登录用户一样简单 下一步……下一步……如此简单 下载…

Floyd(多源汇最短路)

Floyd求最短路 给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,边权可能为负数。 再给定 k 个询问,每个询问包含两个整数 x 和 y,表示查询从点 x 到点 y 的最短距离,如果路径不存在,则输出 impo…

Fortinet数据中心防火墙及服务ROI超300%!Forrester TEI研究发布

近日,专注网络与安全融合的全球网络安全领导者 Fortinet(NASDAQ:FTNT)联合全球知名分析机构Forrester发布总体经济影响独立分析报告,详细阐述了在企业数据中心部署 FortiGate 下一代防火墙(NGFW&#xff09…

缓存淘汰算法(LFU LRU FIFO)及进程的状态和转换

目录 一、缓存淘汰算法 1.LFU(Least Frequently Used)最近最不常用算法 2.LRU(Least Recently User)最近最少使用算法 3.FIFO(First in first out)先进先出算法 二、进程的状态和转换 1.最基本的三种状…

OpenCV图像处理——模版匹配和霍夫变换

目录 模版匹配原理实现 霍夫变换霍夫线检测 模版匹配 原理 实现 rescv.matchTemplate(img,template,method)import numpy as np import cv2 as cv import matplotlib.pyplot as pltimgcv.imread(./汪学长的随堂资料/6/模板匹配/lena.jpg) templatecv.imread(./汪学长的随堂资…

使用chatGPT-4 畅聊量子物理学(三)

集合了人类智慧的照片,来自 1927 年举行的第五届索尔维国际会议。 Omer 什么是“物理系统在被测量之前不具有确定的属性。量子力学只能预测给定测量的可能结果的概率分布" ChatGPT 这句话描述了量子力学中的一种基本原则,即“物理系统在被测量之前…

世微AP2813 平均电流双路降压恒流驱动器 LED储能电源驱动指示灯IC 可恒流可爆闪 可双路恒流

产品描述 AP2813 是一款双路降压恒流驱动器,高效率、外围简单、内置功率管,适用于 5-80V 输入的高精度降压 LED 恒流驱动芯片。内置功率管输出最大功率可达12W,最大电流 1.2A。AP2813 一路直亮,另外一路通过 MODE1 切换全亮,爆闪…

利用OpenCV光流算法实现视频特征点跟踪

光流简介 光流(optical flow)是运动物体在观察成像平面上的像素运动的瞬时速度。光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。…

大模型PEFT技术原理(二):P-Tuning、P-Tuning v2

随着预训练模型的参数越来越大,尤其是175B参数大小的GPT3发布以来,让很多中小公司和个人研究员对于大模型的全量微调望而却步,近年来研究者们提出了各种各样的参数高效迁移学习方法(Parameter-efficient Transfer Learning&#x…

css鼠标样式 cursor: pointer

cursor: none; cursor:not-allowed; 禁止选择 user-select: none; pointer-events:none;禁止触发事件, 该样式会阻止默认事件的发生,但鼠标样式会变成箭头

Hlang社区-前端社区宣传首页实现

文章目录 前言页面结构固定钉头部轮播JS特效完整代码总结前言 这里的话,博主其实也是今年参与考研的大军之一,所以的话,是抽空去完成这个项目的,当然这个项目的肯定是可以在较短的时间内完成的。 那么废话不多说,昨天也是干到1点多,把这个首页写出来了。先看看看效果吧:…

断点续传的未来发展趋势与前景展望

断点续传是一种在网络传输中断后,能够从中断的位置继续传输的技术。它可以有效地避免因为网络不稳定、服务器故障、用户操作等原因导致的传输失败,节省了用户的时间和流量,提高了传输的效率和可靠性。断点续传在很多场景中都有广泛的应用&…