ClickHouse(五)ClickHouse整合其它存储系统

1.ClickHouse整合MySQL

1.1.连接创建

MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许您对表进行INSERT和SELECT查询,以方便您在ClickHouse与MySQL之间进行数据交换。ClickHouse的MySQL引擎可以对存储在远程MySQL服务器上的数据执行SELECT查询。这个模式类似于Hive的外部表。

官网链接:https://clickhouse.tech/docs/en/engines/table-engines/integrations/mysql/

MySQL引擎:https://clickhouse.tech/docs/zh/engines/database-engines/mysql/

语法示例:

CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')
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']);
  • host:port — MySQL 服务器地址。
  • database — 数据库的名称。
  • table — 表名称。
  • user — 数据库用户。
  • password — 用户密码。
  • replace_query — 将 INSERT INTO 查询是否替换为 REPLACE INTO 的标志。如果 replace_query=1,则替换查询
  • 'on_duplicate_clause' — 将 ON DUPLICATE KEY UPDATE 'on_duplicate_clause' 表达式添加到 INSERT 查询语句中。例如:impression = VALUES(impression) + impression。如果需要指定 'on_duplicate_clause',则需要设置 replace_query=0。如果同时设置 replace_query = 1 和 'on_duplicate_clause',则会抛出异常。

注意:

1、此时,简单的 WHERE 子句(例如 =, !=, >, >=, <, <=)是在 MySQL 服务器上执行。

2、其余条件以及 LIMIT 采样约束语句仅在对MySQL的查询完成后才在 ClickHouse中执行。

3、ClickHouse引擎不支持Nullable数据类型,因此,当从MySQL表中读取数据时,NULL将转换为指定列类型的默认值(通常为0或空字符串)。

1.2.映射方式

1.2.1.库的映射

如果这个库里面需要有大量的表需要映射到clickhouse做分析,可以不用移动数据,直接映射就可以执行分析(不推荐使用)

-- 关联MySQL库:
drop database if exists mydb;
create database if not exists mydb ENGINE = MySQL('hadoop2:3306', 'mydb','root', '123456');
-- 查看库和表列表:
show databases;
show tables from mydb;
-- 查询数据:
select * from mydb.testck;

1.2.2.表的映射

drop table if exists testck;
CREATE TABLE mydb.testck
(
    id  int,
    name String
) ENGINE = MySQL('hadoop2:3306', 'mydb', 'testck', 'root', '123456');

注意:当mysql或者ClickHouse数据有修改时会同步到另一端。当向ck中插入数据有主键重复也会直接报错。

1.2.3.IS语法和CTAS语法

IS语法:-- insert into ... select ... 语法

--数据迁移:从mysql中,把数据弄到clickhouse中
insert into mydb.testck2 select * from mysql('hadoop2:3306', 'mydb','testck2', 'root', '123456');
select * from mydb.testck2; //从clickhouse中查询出来的

CTAS语法:-- create table ... as select ... 语法

drop table if exists mydb.testck3;
create table if not exists mydb.testck3 engine = Log as select * from MySQL('hadoop2:3306', 'mytable','root', '123456');
select * from mydb.testck3;

注意:这样的方法不会修改原始数据,但对mysql修改的数据也不会实时同步。

2.ClickHouse整合HDFS

从ClickHouse18.16.0版本开始支持从HDFS读文件,在19.1.6版本对HDFS访问功能进行了增强,支持读和写,在19.4版本以后开始支持Parquet格式。

先在HDFS上准备一个数据文件:student.csv CSV格式的数据

数据如下:

95002,刘晨,女,19,IS
95017,王风娟,女,18,IS
95018,王一,女,19,IS
95013,冯伟,男,21,CS
95014,王小丽,女,19,CS
95019,邢小丽,女,19,IS
95020,赵钱,男,21,IS
95003,王敏,女,22,MA
95004,张立,男,19,IS
95012,孙花,女,20,CS
95010,孔小涛,男,19,CS
95005,刘刚,男,18,MA
95006,孙庆,男,23,CS
95007,易思玲,女,19,MA
95008,李娜,女,18,CS
95021,周二,男,17,MA
95022,郑明,男,20,MA
95001,李勇,男,20,CS
95011,包小柏,男,18,MA
95009,梦圆圆,女,18,MA
95015,王君,男,18,MA
95016,钱国,男,21,MA

上传到HDFS:hadoop fs -put student.csv /clickhouse_data/student/

2.1.从HDFS读取数据

从HDFS上读取数据类似于将HDFS作为外部存储,然后去拉取HDFS上的数据。所以这种模式,肯定要比直接从 ClickHouse 中读取数据要慢的多。

ClickHouse 建表语句:

create database if not exists mydb;
use mydb;
drop table if exists mydb.testck4_csv;
create table if not exists  mydb.testck4_csv(
    id Int8,
    name String,
    sex String,
    age Int8,
    department String
) Engine = HDFS('hdfs://hadoop1:9000/stu*.csv','CSV');

注意:

  1. 支持CSV, TSV, Parquet 等格式,注意CSV是大写的!

  2. 执行并行读写操作(Reads and writes can be parallel)

  3. 字符串中的是否有引号,都能被自动解析,有引号也行,没有引号也行。如果需要关联多个文件,ClickHouse虽然不支持直接关联文件夹,但是对于文件路径还是提供给了

  4. 多个支持,具体可以参照官网:https://clickhouse.tech/docs/en/engines/table-engines/integrations/hdfs/

  5. 支持虚拟列 _path 和 _file,分别代表文件路径,和文件名。

  6. 不支持的操作:alter 和 select ... sample 语法, Indexes 语法,和 Replication 操作

2.2.从HDFS导入数据

先在ClickHouse中创建一张表testck5_csv:

create database if not exists mydb;
use mydb;
drop table if exists mydb.testck5_csv;
create table if not exists testck5_csv(
    id Int8,
    name String,
    sex String,
    age Int8,
    department String
) engine = TinyLog;

从 HDFS 上导入数据到 ClickHouse:

insert into mydb.testck5_csv select * from hdfs('hdfs://hadoop1:9000/student.csv', 'CSV', 'id Int8, name String, sex String, age Int8, department String');

详细语法可以参考官网:https://clickhouse.tech/docs/zh/sql-reference/table-functions/hdfs/

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 是一个针对于 Spring 框架的开发和部署简化的工具,而 ClickHouse 是一个高性能、可扩展的列式数据库管理系统。将 Spring Boot 与 ClickHouse 整合,可以实现高效的数据存储和查询。 首先,我们需要在 Spring Boot 的项目添加 ClickHouse 的驱动依赖。可以通过 Maven 或 Gradle 来管理项目依赖。在 pom.xml(或 build.gradle)文件,添加 ClickHouse 驱动依赖,并指定对应的版本号。 接下来,配置 ClickHouse 的连接信息。在 Spring Boot 的配置文件(application.properties 或 application.yml),添加 ClickHouse 的连接参数,包括用户名、密码、URL 等。这些配置信息将用于建立与 ClickHouse 数据库的连接。 然后,创建 ClickHouse 的数据访问对象(DAO)类。使用 Spring Boot 提供的 JdbcTemplate 或 Spring Data JPA 等方式,与 ClickHouse 进行交互。通过定义合适的实体类和接口,可以方便地进行数据的增删改查操作。 最后,编写业务逻辑代码,调用 ClickHouse 的 DAO 类,实现具体的业务需求。可以利用 ClickHouse 提供的高性能查询和聚合功能,快速地处理大规模的数据。 总结来说,整合 Spring Boot 和 ClickHouse 可以帮助我们更便捷地开发和部署应用程序,同时利用 ClickHouse 的高性能和可扩展性,实现高效的数据存储和查询。这种整合方式适用于需要处理大量数据的项目,例如日志分析、数据分析等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值