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

news2024/11/25 20:40:41

 

 进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注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,张三,19

2,李四,20

c2.csv文件内容:

  3,王五,21

4,马六,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_engine

node1 :) 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()

SETTINGS

    kafka_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.coloradmin.cn/o/878172.html

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

相关文章

UE4拾取物品高亮显示

UE4系列文章目录 文章目录 UE4系列文章目录前言一、如何实现 前言 先看下效果,当角色靠近背包然后看向背包,背包就会高亮显示。 一、如何实现 1.为选中物品创建蓝图接口 在“内容” 窗口中,鼠标右键选择“蓝图”->蓝图接口&#xff0c…

P13-CNN学习1.3-ResNet(神之一手~)

论文地址:CVPR 2016 Open Access Repository https://arxiv.org/pdf/1512.03385.pdf Abstract 翻译 深层的神经网络越来越难以训练。我们提供了一个残差学习框架用来训练那些非常深的神经网络。我们重新定义了网络的学习方式,让网络可以直接学习输入信息与输出信息…

乐鑫ESP32S3串口下载出现奇怪问题解决方法

正在学习ESP32S3,有一个原厂BOX开发板,使用虚拟机,安装 debian11 ,安装IDF4.4.5版本工具。下载box示例代码。 进入example,idf.py set-target esp32s3, idf.py flash 下载时,出现错误: Wrote 22224 bytes…

【Unity实战系列】如何把你的二次元老婆/老公导入Unity进行二创并且进行二次元渲染?(附模型网站分享)

君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,在正式开始讲主线知识之前,我们先来讲点有趣且有用的东西。 我知道,除了很多想从事游戏开发行业的人以外,还…

试岗第一天问题

1、公司的一个项目拉下来 ,npm i 不管用显示 后面百度 使用了一个方法 虽然解决 但是在增加别的依赖不行,后面发现是node版本过高,更换node版本解决。 2、使用插件动态的使数字从0到100(vue-animate-number插件) 第一…

Redis之删除策略

文章目录 前言一、过期数据二、数据删除策略2.1定时删除2.2惰性删除2.3 定期删除2.4 删除策略比对 三、逐出算法3.1影响数据逐出的相关配置 总结 前言 Redis的常用删除策略 一、过期数据 Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可…

Python 图形界面框架TkInter(第八篇:理解pack布局)

前言 tkinter图形用户界面框架提供了3种布局方式,分别是 1、pack 2、grid 3、place 介绍下pack布局方式,这是我们最常用的布局方式,理解了pack布局,绝大多数需求都能满足。 第一次使用pack() import …

大模型相关知识

一. embedding 简单来说,embedding就是用一个低维的向量表示一个物体,可以是一个词,或是一个商品,或是一个电影等等。这个embedding向量的性质是能使距离相近的向量对应的物体有相近的含义,比如 Embedding(复仇者联盟)…

湖南大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 24计算机考研|上岸指南 湖南大学 湖南大学计算机考研招生学院是信息科学与工程学院。目前均已出拟录取名单。 湖南大学信息科学与工程学院内设国家示范性软件学院、国家保密学院和湘江人工智能学院,计算机…

软件测试基础之软件缺陷处理

一、什么是缺陷 不满足用户确定需求、影响软件功能实现的问题、故障 缺陷就是人们通常所说的bug。 ex.一下哪一种选项不属于软件缺陷___。 A.软件没有实现产品规格说明所要求的功能 B.软件中出现了产品规格说明不应该出现的功能 C.软件实现了产品规格说明没有提到的功能 D.软…

什么是抖音SEO,如何做好抖音短视频的SEO优化?

抖音SEO,全称是抖音搜索引擎优化,指的是在了解抖音搜索引擎自然排名机制及算法的基础上,对视频内容进行调整优化,让其排名靠前,从而增加用户点击的概率,达到排名和营销目的。 1、了解算法规则 每个平台都…

会员中心功能实现(小兔鲜儿)【Vue3】

会员中心 整体功能梳理和路由配置 整体功能梳理 个人中心 - 个人信息和猜你喜欢数据渲染我的订单 - 各种状态下的订单列表展示 路由配置(包括三级路由配置) 准备路由模版 <script setup> </script><template><div class"container">…

QML HTTP 请求

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在 Web 开发中,实现与服务器的通信至关重要,其中 HTTP 便是最常用的方式之一。它是一种客户端 - 服务器协议,客户端向服务器发送请求,服务器则返回响应。常被用于在浏览器/客户端和 Web 服务器之间传输消…

一文秒懂HTTP协议到底是什么?原理?

目录 1.什么是http协议&#xff1f; 2.http协议的版本&#xff1f; 3.http文本框架 4.http请求报文 5.http报文格式 6.http响应报文 7.HTTP的状态码 8.HTTP首部介绍 9.什么是URL和URI&#xff1f; 10.CGI是什么&#xff1f; 1.什么是http协议&#xff1f; http&#…

嵌入式 C 语言程序数据基本存储结构

一、5大内存分区 内存分成5个区&#xff0c;它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 1、栈区(stack)&#xff1a;FIFO就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 ​…

【数据结构】八大排序详解

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f40c; 个人主页&#xff1a;蜗牛牛啊 &#x1f525; 系列专栏&#xff1a;&#x1f6f9;数据结构、&#x1f6f4;C &#x1f4d5; 学习格言&#xff1a;博观而约取&…

线性扫描寄存器分配算法介绍

线性扫描寄存器分配 文章目录 线性扫描寄存器分配1. 算法介绍2. 相关概念3. 算法的实现3.1 伪代码3.2 图示 参考文献 论文地址&#xff1a; Linear Scan Register Allocation ​ 我们描述了一种称为线性扫描的快速全局寄存器分配的新算法。该算法不基于图形着色&#xff0c;而…

20个互联网用户Python数据分析项目

这篇文章给大家整理了20个互联网用户数据分析的项目。所有收录的项目&#xff0c;进行了严格的筛选&#xff0c;标准有二&#xff1a; 1.有解说性文字&#xff0c;大家能知道每一步在干嘛&#xff0c;新手友好 2.数据集公开&#xff0c;保证大家可以在原文的基础上自行探索 更…

定长内存池设计ConcurrentMemoryPool

原理 还回来的内存用链表串联起来&#xff0c;称为自由链表 内存块自身进行链接&#xff0c;前四个字节存下一个的地址 结构 template<class T> class ObjectPool { public:T* New(){} private:char* _memory nullptr; //方便切割void* _freeList nullptr; };第一步…

ATF BL1 UFS初始化简单分析

ATF BL1 UFS初始化分析 1 ATF的下载链接2 ATF BL1 UFS 初始化简易流程图3 ATF BL1 ufs初始化简单过程分析3.1 调用过程3.2 hikey960_ufs_init3.3 dw_ufs_init3.3 ufs_init 以海思hikey960为例来介绍&#xff0c;简单介绍在ATF BL1阶段的初始化处理。 1 ATF的下载链接 https:/…