SummingMergeTree(参数:字段):这个引擎会将指定的字段,在合并数据片段的时候对指定的字段,主键相同的进行一个累加;
数据不会持久化到磁盘 临时数据,当我们重启clickhouse服务器的时候会将内存中的数据释放掉,而不会写入到磁盘中;
File表引擎以特殊的文件格式(TabSeparated,Native等)将数据保存在文件中。
数据从ClickHouse导出到文件。将数据从一种格式转换为另一种格式。通过编辑磁盘上的文件来更新ClickHouse中的数据。
实例: create table tb_file_demo1(uid UInt16 , name String) engine=File(TabSeparated) ; 在指定的目录下创建数据文件 /var/lib/ClickHouse/data/db_demo1/tb_file_demo1 [root@linux01 tb_file_demo1]# vi data.TabSeparated 注意这个文件的名字不能变化 1001 TaoGe 1002 XingGe 1003 HANGGE
create table tb_file_demo2(uid UInt16 , name String) engine=File(CSV) ; 插入数据:在指定的目录下插入数据:vi data.CSV 注意后缀是大写 101,TaoGe 102,XingGe 103,HANGGE
导入数据: 先创建一个表 create table tb_client (id UInt16 , name String) engine=TinyLog ;
指定本地文件的路径: cat /data/user.txt | ClickHouse-client -q="INSERT INTO tb_client FORMAT CSV";
默认csv文件的分隔符为逗号,如果遇到有其他特殊符号,我们可以设置,比如分割符为"|"
set format_csv_delimiter="|"
常用的集成引擎主要有:
KafkaMySQLODBCJDBCHDFS我们主要使用的是mysql引擎和hdfs引擎:create table tb_hdfs( uid String, name String )engine=HDFS('hdfs://linux01:8020/user.txt',CSV); -- 设置数据的分隔符 set format_csv_delimiter='|' ;
MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许您对表进行INSERT和SELECT查询,以方便您在ClickHouse与MySQL之间进行数据交换。
MySQL数据库引擎会将对其的查询转换为MySQL语法并发送到MySQL服务器中,因此您可以执行诸如SHOW TABLES或SHOW CREATE TABLE之类的操作。
实例: 创建一个数据库,在clickhouse中的数据库映射到mysql中:
实例: 创建一个数据库,在clickhouse中的数据库映射到mysql中: create database db_mysql engine=MySQL('linux01:3306','db_demo','root','root'); 插入数据到mysql数据库中的表; insert into tb_demo1 values(1,'zsdf',18); 使用mysql引擎是支持我们在clickhouse中查询和插入数据的操作插入数据到mysql数据库中的表;
insert into tb_demo1 values(1,'zsdf',18);使用mysql引擎是支持我们在clickhouse中查询和插入数据的操作
集成引擎中的case when案例 1.先创建表 2.指定csv文件的分割符:
set format_csv_delimiter='|'; drop table tb_case; create table tb_case( name String, xx String, gender String ) engine=HDFS('hdfs://linux01:8020/case.txt',CSV);执行case when的需求
select xx, sum(if(gender='男' ,1,0 )) m, sum(if(gender='女' ,1,0 )) n from tb_case group by xx;结果展示
┌─xx─┬─m─┬─n─┐ │ B │ 1 │ 2 │ │ A │ 2 │ 1 │ └────┴───┴───┘
multiIf函数可以类比为java语言中的if ...eles if ....eles if........else 语法
SELECT left, right, multiIf(left < right, 'left is smaller', left > right, 'left is greater', left = right, 'Both equal', 'Null value') AS result FROM LEFT_RIGHT┌─left─┬─right─┬─result──────┐ │ ᴺᵁᴸᴸ │ 4 │ Null value │ │ 1 │ 3 │ left is smaller │ │ 2 │ 2 │ Both equal │ │ 3 │ 1 │ left is greater │ │ 4 │ ᴺᵁᴸᴸ │ Null value │ └────┴─────┴──────────┘
文件必须在指定的目录下:/var/lib/clickhouse/user_files/
将本地文件根据自己定义的字段,映射成表;
指定导出数据的格式,在shell端执行的命令,导出数据命令,将查询出来的结果导出到本地文件
clickhouse-client -d 'db_demo2' -q 'select * from tb_a FORMAT TSV' > /a.tsv
需要指定数据库名称和要查询的表的sql语句;如:db_demo2 值得是数据库的名称,select * from tb_a FORMAT TSV 要查询表的sql语句和指定 输出文件的格式为TSV;
1 使用集成引擎 HDFS ****在创建表的时候指定表引擎为mysql或者是hdfs 重点掌握 File 了解即可file引擎;详见3 MySQL **** 在创建表的时候指定表引擎为mysql或者是hdfs 重点掌握 KAFKA 2 from 表函数 file mysql **** hdfs**** .... 表函数,不用创建表直接从hdfs中的文件读取,或者是从mysql中读取 3 insert into values 普通的插入数据的方法; 4 cat 本地文件 | clickhouse-client -q 'insert into tb_name format +' 文件格式' *** 将本地文件映射为clickhouse中的表 5 insert into tb_name select 字段 from tb_name2 ; 6 create table tmp_a engine=Log as select * from tb_a ;****** 从一个表中查询数据然后导入到另一个创建的新表
limit为分页函数,指定你要展示数据的前几行,但是在clickhouse中limit和之前用法有不同,不同之处在于, limit n by 字段,就是可以按照字段分组,然后取组内的前几条数据;
select * from tmp_a engine order by uid,name desc limit 2 by uid; 原数据查询: ┌─uid─┬─name┐ │ 1 │ 98 │ │ 1 │ 93 │ │ 2 │ 99 │ │ 1 │ 96 │ │ 2 │66 │ │ 2 │ 23 │ └─────┴───┘ 结果: ┌─uid─┬─name ┐ │ 1 │ 98 │ │ 1 │ 96 │ │ 2 │ 99 │ │ 2 │ 66 │ └─────┴── ┘
在clickhouse中with是用来定义一个常量的如:
with "hello" as h SELECT concat(h,',',name) --将这个常量和指定字段拼接 FROM a;
array数组中在给array数组中插入数据的方式,1.array(1,2,3)也可以是2. [1,2,3]
数据准备:
CREATE TABLE arrays_test ( s String, arr Array(UInt8) ) ENGINE = Memory; INSERT INTO arrays_test VALUES ('Hello', [1,2]), ('World', [3,4,5]), ('Goodbye', []); ┌─s───────────┬─arr─────┐ │ Hello │ [1,2] │ │ World │ [3,4,5] │ │ Goodbye │ [] │ └─────────────┴─────────┘ SELECT s, arr FROM arrays_test ARRAY JOIN arr; 结果:┌─s─────┬─arr─┐ │ Hello │ 1 │ │ Hello │ 2 │ │ World │ 3 │ │ World │ 4 │ │ World │ 5 │ └───────┴─────┘取数组的角标的方法
按照某个字段分组,将组内的例如姓名收集到一个数组中,展示出来,相当于hive中的collect_list();