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.rhkb.cn/news/91312.html

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

相关文章

数据结构与算法-栈(LIFO)(经典面试题)

一:面试经典 1. 如何设计一个括号匹配的功能?比如给你一串括号让你判断是否符合我们的括号原则, 栈 力扣 2. 如何设计一个浏览器的前进和后退功能? 思想:两个栈,一个栈存放前进栈&…

派克Parker伺服驱动器 高性能电机控制系统的应用详解

派克Parker伺服驱动器及电机是一种高性能的电机控制系统,广泛应用于机器人、医疗设备、工业自动化和航空航天等领域。具有高精度、高可靠性、高动态性能、低噪音、低振动、低能耗等优点,采用了先进的数字信号处理技术,能够实现高精度的位置控…

回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测

回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测; 2.运行环…

【JavaEE基础学习打卡02】是时候了解Java EE了!

目录 前言一、为什么要学习Java EE二、Java EE规范介绍1.什么是规范?2.什么是Java EE规范?3.Java EE版本 三、Java EE应用程序模型1.模型前置说明2.模型具体说明 总结 前言 📜 本系列教程适用于 Java Web 初学者、爱好者,小白白。…

WPF 本地化的最佳做法

WPF 本地化的最佳做法 资源文件英文资源文件 en-US.xaml中文资源文件 zh-CN.xaml 资源使用App.xaml主界面布局cs代码 App.config辅助类语言切换操作类资源 binding 解析类 实现效果 应用程序本地化有很多种方式,选择合适的才是最好的。这里只讨论一种方式&#xff0…

医院后勤管理用什么系统好?的修医院报修管理系统有哪些优势?

随着医院后勤工作量的不断增加,需要协调和维护的设备和部门也随之增多。传统的医院后勤管理方式已经显得不够优越,其劣势日益凸显,无法满足实际工作需求。因此,快速推动医院后勤信息化管理已成为当前医院发展的迫切需求。而的修医…

concrt140.dll丢失怎么恢复?教你5种修复方法

首先介绍一下concrt140.dll是什么 concrt140.dll是Microsoft Visual C Redistributable for Visual Studio 2015所需的一个动态链接库文件。它是用于支持C程序运行的重要组件之一。当系统中缺少或丢失concrt140.dll文件时,可能会导致一些程序无法正常运行。 首先&a…

BC117 小乐乐走台阶(附完整代码)

描述 小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法? 输入描述 输入包含一个整数n (1 ≤ n ≤ 30) 输出描述 输出一个整数,即小乐乐可以走的方法数。 思路&a…

Ajax及前端工程化

Ajax:异步的js与xml。 作用: 1、通过ajax给服务器发送数据,并获得其响应的数据。 2、可以在不更新整个网页的情况下,与服务器交换数据并更新部分网页的技术。 一、同步与异步 二、原生Ajax 1、准备数据地址 2、创建XMLHttpReq…

时序预测 | MATLAB实现基于BP神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于BP神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于BP神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 Matlab实现BP神经网络时间序列预测未来(完整…

提升物流管理效率,快递批量查询高手软件助你一臂之力

物流管理中,准确跟踪和掌握快递的物流信息是非常重要的。而快递批量查询高手软件的出现,大大提高了物流管理的效率,为企业带来了诸多便利。 传统的快递查询方式往往需要手动逐个输入快递单号,费时费力且容易出错。而有了快递批量查…

收银一体化-亿发2023智慧门店新零售营销策略,实现全渠道运营

伴随着互联网电商行业的兴起,以及用户理念的改变,大量用户从线下涌入线上,传统的线下门店人流量急剧收缩,门店升级几乎成为了每一个零售企业的发展之路。智慧门店新零售收银解决方案是针对传统零售企业面临的诸多挑战和问题&#…

混合云环境中 Kubernetes 可观测性的 6 个有效策略...

2023 年,原生云应用程序和平台将快速增长。组织不断努力最大限度地发挥其应用程序的潜力,确保无缝的用户体验并推动业务增长。 混合云环境的兴起以及 Kubernetes 等容器化技术的采用彻底改变了现代应用程序的开发、部署和扩展方式。 在这个数字领域&am…

i++和++i在操作数栈和局部变量表的分配

1、执行运算指令时,压入操作数栈的顺序不受运算优先级影响 2、i 先将i值压入到操作数栈,再在局部变量表自增 3、i 先在局部变量表自增,再压入到操作数栈 记忆方法:i的先后,表示压入操作数栈的先后。 看如下例子&am…

AOP与SpringAOP

AOP与SpringAOP 一、什么是AOP,什么是SpringAOP二、AOP与拦截器的区别三、实现SpringAOP1.添加SpringBootAOP依赖2.创建切面3.创建切点4.创建通知5.创建连接点 效果 一、什么是AOP,什么是SpringAOP AOP即Aspect-Oriented Programming面向切面编程。 它是…

08 - 追加commit和修改最新的commit message

查看所有文章链接:(更新中)GIT常用场景- 目录 文章目录 1. 追加提交2. 修改最新的commit message 1. 追加提交 将改动追加到上一次的commit 现在我已经修改了Readme文件并且已经add、commit操作,但是还没有push到远程仓库&#x…

kafka基本概念及操作

kafka介绍 Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的 (replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各…

【脚踢数据结构】内核链表

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,Linux基础,ARM开发板,软件配置等领域博主🌍快上🚘,一起学习,让我们成为一个强大的攻城狮!送给自己和读者的一句鸡汤🤔&…

ide internal errors【bug】

ide internal errors【bug】 前言版权ide internal errors错误产生相关资源解决1解决2 设置虚拟内存最后 前言 2023-8-15 12:36:59 以下内容源自《【bug】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是h…

8.15号经典模型复习笔记

文章目录 Deep Residual Learning for Image Recognition(CVPR2016)方法 Densely Connected Convolutional Networks(CVPR2017)方法 EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks(ICML2019)方法 Re…