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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

opencv-python(二)

马赛克 img cv2.imread(./bao.jpeg)print(img.shape)img2 cv2.resize(img,(35,23))img3 cv2.resize(img2,(900,666))cv2.imshow(bao,img3)cv2.waitKey(0)cv2.destroyAllWindows()img2 cv2.resize(img, (90,66))img3 np.repeat(img2, 10, axis 0) # 重复行img4 np.repeat(…

I2C LCD1602液晶显示屏

前言 本文实现在 LCD1602显示屏的使用。 显示屏使用带I2C转接板的,如下图所示。 并且会做一些有趣的显示方式。 效果预览 材料准备 材料数量价格Arduino nuo118杜邦线411602A显示屏110 依赖库下载 本文使用都库在 arduino ide 中搜索 LiquidCrystal_I2C 即可找到。 注意作…

混合动力电动汽车介绍(一)

电动汽车发展的技术背景主要包含环境问题和能源问题两大方面。环境问题的表现形式为空气污染,而能源问题的表现形式为现有能源供应体系对化石燃料的过分依赖。《新能源汽车产业发展规划(2021-2035)》中明确我国新能源汽车技术研发的“三纵”、…

kivy.garden.matplotlib

matplotlib 是什么 # pip install matplotlib2.2.2 from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg FigureCanvasKivyAgg class FigureCanvasKivyAgg(FigureCanvasKivy, FigureCanvasAgg):FigureCanvasKivyAgg class. See module documentation f…

SickOS1.1 - Shellshock原理和利用过程精讲

SickOS1.1的另一种思路;用另一种方法打透这台机器 Nikto扫描 正常都是-h扫描;有代理就用-useproxy 指向的代理ip:端口 nikto -h 192.168.218.157 -useproxy 192.168.218.157:3128apache版本,有点低,现在都是2.4.54版本了&#x…

Cobaltstrike常用功能

一、快捷工具栏 3、需要创建监听器,才能让靶机上线,连接我们公网服务端上去开启的帧监听端口,做任何操作 都是通过服务器的IP地址去连接靶机,去和靶机进行文件stage的一个传输和交互。这里推荐把cs 放到公网上边,比较…

通过LabVIEW提升生产设备自动化水平

现代制造业对生产设备的自动化水平提出了越来越高的要求。使用LabVIEW这一强大的图形化编程环境,可以显著提升生产设备的自动化程度,改善生产效率和产品质量。本文将详细分析如何通过LabVIEW改善生产设备的自动化水平,并提供具体的实施策略与…

数论1---整除

概念与基本性质就不说了 例题1:已知a|n,b|n.且axby1,求证:ab|n 即: 所以:ab|n 例题2:设m是一个大于2的正整数,证明:对于任意正整数n,都有 由于我不想打公式了直接拍照…

opencv进阶 ——(九)图像处理之人脸修复祛马赛克算法CodeFormer

算法简介 CodeFormer是一种基于AI技术深度学习的人脸复原模型,由南洋理工大学和商汤科技联合研究中心联合开发,它能够接收模糊或马赛克图像作为输入,并生成更清晰的原始图像。算法源码地址:https://github.com/sczhou/CodeFormer…

SAP PP学习笔记14 - MTS(Make-to-Stock) 按库存生产(策略10),以及生产计划的概要

上面讲了SAP里面的基础知识,BOM,作业手顺(工艺路线),作业区(工作中心),MRP,MPS等概念,现在该到用的时候了。 SAP PP学习笔记07 - 简单BOM,派生BO…

【教程】如何实现WordPress网站降级(用于解决插件和主题问题)

在最新可用版本上运行WordPress安装、插件和主题是使用该平台的关键最佳实践。还建议使用最新版本的PHP。但是,在某些情况下,这是不谨慎或不可能的。 如果您发现自己处于这种情况,您可能需要撤消更新并降级您的WordPress网站(或其中的一部分)。幸运的是,有一些方法可用于…

uniapp 怎么设置凸起的底部tabbar

1. uniapp 怎么设置凸起的底部tabbar 1.1. 方案一系统提供 1.1.1. 使用uniapp官方提供的属性midButton 使用时,list数组须为偶数 (1)pages.json "tabBar": {"custom": true,"color": "#8F8F94",&q…

推荐网站(19)anytools图片分辨率处理网站

今天,我要向您推荐一个非常实用的在线图片处理工具网站——AnyTools。这个网站提供了一站式的图片分辨率处理服务,并且具备添加各种过滤器的功能,非常适合需要快速调整图片大小和风格优化的场合。 多分辨率支持:用户可以自定义图片…

(南京观海微电子)——LVD屏介绍

LVDS(Low Voltage Differential Signaling,即 低电压差分信号 ) 接口又称 RS-644 总线接口,是20世纪90年代才提出的一种 数据传输 和接口技术。 LVDS接口是美国NS美国国家半导体公司为克服以 TTL电平 方式传输宽带高码率数据时功…

Linux--线程的互斥

线程系列: 一、线程的认识:线程的认识:误进解线程的概念和线程的基本控制 二、Linux–线程的分离、线程库的地址关系的理解、线程的简单封装 线程的互斥 线程互斥(Thread Mutual Exclusion)是多线程编程中的一个重要概…

软件测试进阶

目录 一、自动化测试 1.概念 2.Selenium 2.1 概念 2.1.1 Selenium是什么? 2.1.2 Selenium特点 2.1.3 工作原理 2.2 SeleniumJava环境搭配 2.3 定位元素 2.3.1 CSS语法 2.3.2 XPath语法 2.4 应用 2.4.1 点击提交文本 2.4.2 模拟输入 2.4.3 清除文本 2…

驰骋低代码开发平台概念与主张

驰骋低代码开发平台概念与主张 一、引言 在数字化转型的浪潮中,低代码开发平台因其高效、灵活、成本效益显著的特点,逐渐成为企业快速构建应用系统的首选。作为国内领先的开源低代码开发平台,驰骋低代码致力于为企业和开发者提供一套全面、…

(南京观海微电子)——屏幕材质及优缺点对比

LED/LCD LCD(Liquid Crystal Ddisplay)即“液晶显示器”,由两块偏光镜、两块薄膜晶体管以及彩色滤光片、光源(荧光灯)、显示面板组成的成像元器件。 LED(Light Emitting Diode)即“发光二极管…

冒泡排序与快速排序

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 关注博主带你了解更多数据结构知识 1.冒泡排序 冒泡排序 private static void swap(int[] arrary,int i,int j){int tmp arrary[i];arrary[i] arrary[j];arrary[j] tmp;public static void bubbl…

[docker] docker 安全知识 - docker api, 权限提升 资源管理

[docker] docker 安全知识 - docker api, 权限提升 & 资源管理 这是 docker 安全的最后一篇 暴露 docker api 在 [docker] docker 安全知识 - docker 系统性简介 中曾经提到,docker cli 使用 restful api 与客户端和 docker daemon 之间交流。默认情况下&…