ClickHouse 使用技巧总结

文章目录

  • 数据导入、导出技巧
    • 外部文件导入导技巧
    • 使用集成表引擎导入、导出数据
  • 建表技巧
    • 表引擎选择技巧
    • 分区键选择技巧
    • 数据结构选择技巧
    • 分区技巧
  • 高级技巧
    • 物化视图
    • 投影
    • 位图
    • 变更数据捕获
  • 常见报错及处理方法

数据导入、导出技巧

外部文件导入导技巧

ClickHouse作为OLAP即席分析引擎,不可避免地需要将数据从业务数据库、传统数据仓库等数据源中提取数据,当数据计算完成后,也可能需要将数据导出为外部数据文件供其他系统使用。
image.png

CSV、TSV文件导入建议

  • 尽量使用TSV代替CSV,CSV 中如果真实数据中也出现了逗号,此时引擎无法区分这个逗号是分隔符还是数据
  • 尽可能使用时间戳代替时间文本
  • 将ODS层数据表的时间类型设置为String 先将ClickHouse中目标表时间日期类型的字段设置为string,先将数据导入,接着对这个ODS的表进行数据清洗,通过ClickHouse内置的SQL函数解决问题

数据导出技巧

  • 通过INTO OUTFILE导出

    image.png

  • 通过文件表引擎导入、导出数据,创建表文件引擎:

    image.png
    导入导出SQL:
    image.png

  • 通过命令行重定向导出

    image.png

使用集成表引擎导入、导出数据

  • 利用MySQL表引擎实现数据的导入、导出

    image.png
    在创建MySQL表引擎时,需要注意ClickHouse中本地表的列名必须和远程MySQL的列名完全一致。
    MySQL 与 Clickhouse 数据类型映射关系如下:
    image.png
    创建MySQL外部表后,即可通过下面的SQL语句实现数据的导入、导出。
    image.png

  • 利用MongoDB表引擎实现数据的导入、导出

    利用下面的SQL语句创建外部MongoDB表引擎:
    image.png
    创建MongoDB外部表后,即可通过下面的SQL语句实现数据的导入:
    image.png

  • 利用HDFS表引擎实现数据的导入、导出

    利用下面的SQL语句创建外部HDFS表引擎
    image.png
    HDFS表引擎还支持对HDFS的路径使用通配符进行模糊处理,以支持更灵活的HDFS文件夹策略。ClickHouse支持的通配符如下图所示:
    image.png
    对数据进行导入、导出:
    image.png

  • 利用S3表引擎实现数据的导入、导出

    表引擎创建:
    image.png

  • 利用PostgreSQL表引擎实现数据的导入、导出

    image.png
    PostgreSQL和ClickHouse数据类型的对应关系
    image.png
    数据的导入、导出:
    image.png

  • 利用JDBC表引擎实现数据的导入、导出

    要使用JDBC表引擎,必须先运行一个名为clickhouse-jdbc-bridge的Java进程,并做适当的配置。关键要配置好数据库驱动和数据源地址。下面展示一段clickhouse-jdbc-bridge的配置信息。其中数据源驱动的地址可以是一个远程的地址,也可以配置成本地的文件路径:
    image.png
    表引擎创建:
    image.png
    image.png
    数据的导入、导出:
    image.png
    另外,JDBC表引擎由于配置信息已经存储在了clickhouse-jdbc-bridge的配置文件中,因此还有一种特殊的不需要创建ClickHouse虚拟表的访问方法。可以利用这种方式将数据导入ClickHouse本地表或外部数据文件,代码如下:
    image.png

  • 不要利用外部表引擎进行复杂查询

    在很多情况下,复杂SQL查询性能很差,而且有可能对业务产生影响。只有在满足如下条件时,利用该SQL查询的技巧才能获得比较高的收益。

    • 远程数据表经常发生变动。
    • 远程数据表数据量比较小。
    • 在ClickHouse中的查询语句是低频的。
    • 不会影响其他业务的正常运行,能够忍受这些影响。
  • 对数据量大的数据表进行迁移时,利用TSV进行中转

    在应对大批量数据时,建议按照年、月或日对任务进行切分,启动多个进程并行执行。另外,将数据先导入TSV进行中转,避免中途出错导致整个任务重新运行。

  • 利用Kafka表引擎实现数据的导入、导出

    Kafka表引擎一般和ClickHouse的物化视图一起使用,否则ClickHouse只会读取Kafka中最新的消息。通过ClickHouse的物化视图,在后台将Kafka中的数据源源不断地写入本地,以实现Kafka数据的持久化。下面展示创建Kafka表引擎的SQL语句:
    image.png
    image.png
    创建Kafka表引擎后,可以对该表引擎进行SELECT查询,但是对该表的查询只会查询到Kafka中最新的一条数据。需要从该时刻将Kafka中的数据源源不断地持久化保存,必须利用ClickHouse提供的物化视图的能力,代码如下:
    image.png

建表技巧

表引擎选择技巧

  • 优先选择MergeTree家族的表

    基于MergeTree表引擎所派生出来的多个表引擎说明如下:
    image.png
    在使用时建议先创建基础的MergeTree表,在基础MergeTree表上再构建这些派生的MergeTree表引擎,避免由于使用不恰当的主键组合导致数据丢失。

  • 利用Buffer表引擎解决大量INSERT带来的问题

    由于Buffer表必须有底层物理表,因此创建Buffer表时不需要列出各列的类型,代码如下:
    image.png
    通过Buffer表,可以解决ClickHouse遇到突发大量INSERT语句时报错的问题,起到缓冲的作用。使用Buffer表也存在如下一些问题:

    • 由于ClickHouse没有使用WAL(Write Ahead Log,预写日志)技术,因此系统崩溃可能导致丢失数据。
    • Buffer写入物理表时,可能由于物理表引擎的特性导致数据错乱。例如当底层表为折叠表时可能因为丢失顺序而造成错乱。

    建议在满足如下条件的情况下使用Buffer表:

    • 数据少量丢失不会影响业务。
    • 底层表选择基础的MergeTree表引擎。
  • 利用Memory表引擎提高并发查询能力

    Memory也是一个内存表,和Buffer不同的是,Memory表引擎不需要底层的数据表。Memory表也不会将数据定期写入磁盘。

    ClickHouse由于每次查询都会大量利用单机资源,因此并发能力并不高,解决该问题的一个策略是组建ClickHouse集群,在某些场景下还可以利用Memory表引擎提高ClickHouse的并发能力。

    利用ClickHouse的Memory表引擎提高并发能力,并不是随意将查询所需的表载入内存后查询。而是根据业务进行判断,如果大量的并发查询是查询某一个固定的模型,那么需要将该模型固化为Cube,将Cube保存为Memory表,以应对高并发查询的需求。

    Memory表引擎解决并发问题的核心在于,能够将模型转化为Cube,如果不能转化为Cube,那么使用Memory表引擎可能会得不偿失。需要根据业务的实际情况进行判断,千万不能将查询所涉及的表都塞入Memory表,否则ClickHouse的内存可能会溢出,导致服务器崩溃。

分区键选择技巧

ClickHouse的主键就是分区键,和传统事务数据库的主键不同,ClickHouse的主键不具备唯一性约束,只是分区键的别名,在选择分区键(主键)时也有一些技巧。

  • 最左原则,一定要将最频繁使用的列放在最左边。很多情况下,放在右边的列可能无法得到加速。
  • 适当冗余建表,ClickHouse是一个压缩率很高的数据库,我们完全不必强求数据在ClickHouse中只存一份,当遇到多个查询任务需要不同的排序键时,可以放心大胆地创建一个除了主键不同,其他都相同的数据表。

数据结构选择技巧

使用低基数类型

  • 低基数类型(LowCardinality)是ClickHouse中的一个特殊的包装类型,通过该类型可以将数据类型进行字典编码,替换为更高效的存储格式。尤其当某一类去重后的数量少于10000时,可以大幅提高SELECT操作的效率。

  • LowCardinality支持对String、FixedString、Date、DateTime和不包含Decimal的数组类型进行自动化的字典编码:

    image.png

  • 在ClickHouse中可以使用低基数类型替换原始的String类型,也可以使用低基数类型替换枚举类型

分区技巧

慎重使用分区

  • 不建议大量使用分区。在很多情况下,分区并不能提高查询效率,过多地分区有可能降低性能。ClickHouse中分区功能仅仅是为数据管理提供便利,例如以分区为单位进行删除等。

高级技巧

物化视图

使用物化视图代替视图

  • 物化视图会将数据写入磁盘,而视图只是一个虚拟的表,并不会真正存储数据。通过使用物化视图可以大幅提高查询速度:

    image.png
    物化视图和物理表类型的区别在于物化视图会自动识别底层表的变动,当底层表变动时会自动映射到物化视图中。

投影

使用投影能力

  • ClickHouse的索引满足最左原则,当未按照最左原则进行查询时,速度会变慢,投影就是一个解决该问题的方案,其实现原理是将不满足最左原则的查询条件进行固化,本质上可以理解为创建了一个按照新的顺序排列的数据副本,当查询条件满足这个副本时,自动在该副本上查询,从而实现性能加速:

    image.png

位图

使用位图结构

  • 使用 Bitmap 等位图结构可以节省大量存储空间,并且位图的计算效率很高。

变更数据捕获

使用内置的CDC能力获取实时数据

  • ClickHouse通过MaterializeMySQL和MaterializePostgreSQL两个引擎提供MySQL和PostgreSQL的CDC集成支持。

常见报错及处理方法

解决“too many parts”异常

  • too many parts是ClickHouse经常会出现的错误,出现这种错误的原因在于短期内建立了太多的分区。要解决这个问题,可以在数据进入ClickHouse前进行预排序,或者使用前边提到的缓冲区表引擎。

解决“memory limit”异常

  • 内存不足,优化SQL 或者将计算下推,使用 Spark 来查询复杂 SQL。

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

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

相关文章

每日一题《leetcode--206.反转链表》

https://leetcode.cn/problems/reverse-linked-list/ 这道题可以定义一个新结点newhead,newhead指向NULL。此时遍历所给链表将遍历的每个结点头插到newhead上。 struct ListNode* reverseList(struct ListNode* head) {struct ListNode* curhead;struct ListNode* n…

Go语言垃圾回收(GC原理)

1. GC回收机制 1.1 V1.3标记清除法 (1)概述 1.STW暂停 STW(暂停业务逻辑,找出可达和不可达对象) 2.对可达对象做上标记 标记完成之后,对象5和对象6不可达,被GC清除.之后STW结束. (2).缺点 STW :让程序暂停,程序出现卡顿.标记需要扫描整个heap.清除数据会产生heap碎片. 1.…

YYDS练手 130道python练习题 完整版PDF

近年来,Python在编程语言界里赚足了风头,无论是受欢迎程度,还是薪资待遇,都非常可观,相应的,Python岗位要求也越来越高,无论你是零基础还是老前辈,在Python面试中都不能轻视。 不打…

对比WPF和Avalonia的边框渲染差异

众所周知&#xff0c;诸如Border、Rectangle等元素&#xff0c;是具有边框的。但在WPF和Avalonia中&#xff0c;边框的渲染机制有所不同。 如下代码&#xff0c;Border的边框和背景色均为黑色&#xff0c;并且将透明度设为0.5&#xff1a; <Border Width"100" H…

模拟实现C++vector

一&#xff1a;C库中对于vector的介绍 vector的底层其实就是数据结构中的顺序表&#xff0c;顺序表的底层就是变长数组&#xff0c;是一段连续的物理空间 在下面的实现中&#xff0c;重点实现的是其中的迭代器和插入删除&#xff0c;下标访问等功能&#xff0c;模拟实现模板类…

Vue中使用vuex进行全局数据共享处理

1、简介 在之前的博文中&#xff0c;介绍了如何进行组件之间的数据传递&#xff0c;但是对于所有组件共享的变量来说&#xff0c;使用组件之间的数据传递实现复杂&#xff0c;因此本文引入vuex进行全局数据共享。 2、vuex的下载配置 2.1、vuex的下载 # 对于vue2来说&#xf…

IP地址开启HTTPS方法

可以使用IP地址申请SSL证书&#xff0c;申请之前必须是公网IP地址&#xff0c;不支持内网IP地址申请。 申请过程需要确定IP地址外网可以访问&#xff0c;这里特别注意只是申请过程中可以访问。访问验证过程必须采取80端口、443端口两者选择1个&#xff0c;不可以用其它端口进行…

下载视频怎么转换MP4?wmv转换mp4,推荐这3种方法

在数字化时代&#xff0c;我们经常需要从网上下载各种视频&#xff0c;但有时候下载的视频并不是我们想要的格式&#xff0c;比如WMV。为了能在更多的设备上播放或进行编辑&#xff0c;我们可能需要将其转换为更通用的MP4格式。 那么&#xff0c;下载的视频如何转换成MP4呢&am…

第三篇 编译器和译码器

实验三 编码器和译码器 3.1 实验目的 上一章节我们学习了简单组合逻辑电路——多路数据选择器&#xff0c;在本章节我们将学习另外一种数字系统中常见的简单组合逻辑电路——编码器和译码器。然后通过一个设计一个简易的计算器让大家进一步巩固FPGA开发的流程和方法。 本节您…

“神经网络之父”和“深度学习鼻祖”Geoffrey Hinton

“神经网络之父”和“深度学习鼻祖”Geoffrey Hinton在神经网络领域数十年如一日的研究&#xff0c;对深度学习的推动和贡献显著。 一、早期贡献与突破 反向传播算法的引入&#xff1a;Hinton是将反向传播&#xff08;Backpropagation&#xff09;算法引入多层神经网络训练的…

【C++进阶】深入STL之vector:构建高效C++程序的基石

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;模拟实现string &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之vector &#x1f4d2;1.ve…

网络编程(七)

网络编程&#xff08;七&#xff09; UNIX域套接字&#xff08;本地间进程间通信的技术&#xff09;&#xff08;S文件&#xff09;基于TCP传输基于UDP传输 UNIX域套接字&#xff08;本地间进程间通信的技术&#xff09;&#xff08;S文件&#xff09; socket同样也可以用于本…

OpenCV-绘制虚线

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 功能函数 // 绘制虚线 void DrawDottedLine(cv::Mat &input, cv::Point p1, cv::Point p2, cv::Scalar color, int thickne…

Android Graphics 显示系统 - Android Jank detection with FrameTimeline

“ 最近有公司同事在处理UI卡顿及FPS自动化监测的问题&#xff0c;我也顺便看了一点相关的内容&#xff0c;其中在Perfetto的官方说明文档中有一篇关于利用FrameTimeLine进行Jank监测的解读&#xff0c;个人觉得蛮有意思的&#xff0c;借助工具翻译该篇文章并加上本人拙劣的解读…

C++系列-类模板

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 类模板的定义格式&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; template<class T> class Stack { public:Stack(size_…

【Java EE】网络原理——HTTPS

目录 1.HTTPS是什么 2.“加密”是什么 3.HTTPS的工作过程 3.1引入对称加密 3.2 引入非对称加密 4.中间人攻击 5.引入证书 6. 理解数据签名 7.通过证书解决中间人攻击 7.1 查看浏览器的授信任证书发布机构 7.2 中间人有没有可能篡改证书&#xff1f; 7.3 中间人整个掉…

latex公式输入练习

给大家提供几个公式供大家练习latex输入数学公式&#xff0c;同时也是对自己新学latex语言的一种复习吧。&#xff08;如果大家对latex输入公式感兴趣&#xff0c;推荐一下哔站视频&#xff1a;LaTeX公式保姆级教程 (以及其中的各种细节)_哔哩哔哩_bilibili&#xff09; 公式一…

基于.NetCore和ABP.VNext的项目实战七:全局异常处理并日志记录

ABP框架已经默认为我们实现了全局的异常模块,这里我们自定义全局异常模块,先在HelloWorldController中写一个异常接口,测试下ABP的默认全局异常: [HttpGet][Route("Exception")]public string Exception(){throw new NotImplementedException("这是一个未实…

Vue——监听器简单使用与注意事项

文章目录 前言编写简单demo注意事项 前言 监听器&#xff0c;在官网中称为侦听器&#xff0c;个人还是喜欢称之为监听器。官方文档如下&#xff1a; vue 官网 侦听器 编写简单demo 侦听器在项目中通常用于监听某个属性变量值的变化&#xff0c;并根据该变化做出一些处理操作。…

leetcode第263题:丑数

丑数的因子只能是2,3,5。但是可能有多个2&#xff0c;多个3&#xff0c;多个5.因此需要循环地除以2、3、5. public class Solution {public bool IsUgly(int n) {if (n < 0) {return false;}int[] factors {2, 3, 5};for ( int i0;i<3;i) {int factorfactors[i];while …