让决策更智能
新一代智能数据分析平台

直连ClickHouse & 高性能查询表的注意事项

观小数发表于:2021年01月21日 18:54:08更新于:2021年01月21日 18:54:42

概述

针对大数据量查询较慢的场景,我们引入了基于ClickHouse的高性能查询表功能;部分客户在搭建数仓的时候也会在最上层引入ClickHouse,通过直连此ClickHouse在BI中展示数据。ClickHouse在提高了查询效率的同时,存在一些与其他常见数据库的差异与限制,本文将做简单说明,如有错漏,欢迎补充、指正。


注意事项

1. 窗口函数

ClickHouse不支持窗口函数,但对于某些特殊场景,有相应的workaround,比如https://cloud.tencent.com/developer/article/1613028

(但未验证性能,不确定是否耗资源,谨慎使用)


2. 大小写敏感

函数名称

ClickHouse的某些函数对大小写敏感,比如toDate()函数写成todate()就会报错;但对某些函数又大小写不敏感,比如length()、Length()都可以返回字符串长度。个人判断对于多个单词组成的函数名,基本符合驼峰命名法,具体使用的时候需注意。

表名&字段名称

ClickHouse对于字段名称的大小写也是敏感的,比如ddl定义了一张名为orders的表,其中有一个字段叫做Itemnum,那么要查询此表的这个字段,必须写作

select Itemnum from orders

其他的不管把字段名写作ItemNum或者表名写作Orders都会报错


3. 函数差异

  • ClickHouse中常用函数的名称、语法可能与常规数据库不同,比如字符串转换成日期,在ClickHouse中是toDate(),而不是to_date()或str_to_date()。关于toDate()函数官方文档未做详细说明,个人测试此函数似乎只支持数字,比如toDate(11111),或者 'yyyy-MM-dd', 'yyyy/MM/dd', 'yyyy MM dd'格式及相应带时分秒格式的字符串,输入其他格式的日期字符串则会报错。如有解析'yyyyMMdd'等其他格式的日期字符串,可以先对字符串做处理,或者使用parseDateTimeBestEffort()函数,此函数可自动支持各种格式的日期字符串,具体可参考官方文档。

  • ClickHouse中很多类型转换函数都有OrNull,OrZero的后缀,这是用于处理不符合相应函数处理范围的数据或NULL的。比如toInt8('12.34'),12.34不是整型数字的字符串,不可被toInt8解析成功,会报错;如果使用toInt8OrZero('12.34')则会返回0,或toInt8OrNull('12.34')则会返回null。


4. 数据类型差异

ClickHouse中基本的数据类型与其他数据库大差不差,部分类型名称可能存在差异,比如整型字段在其他数据库中是int,smallint,bigint等,而在ClickHouse中是Int8,Int16,Int32等。这些差异如果在使用的时候存在疑惑,可以查询文档,此处要介绍的是ClickHouse中比较独特的一种数据类型Nullable。

个人认为Nullable严格来说甚至不能算是一种数据类型,而是对具体数据类型的一种特殊标识、限制。带Nullable()的字段,允许其中的缺失值默认存储为NULL,比如Nullable(Int8)类型的字段,可以存储Int8类型的值,且没有具体数值的行对应的值将被存储为NULL。

之所以特别强调Nullable()是因为ClickHouse对于数据类型限制极为严格,在上面的场景中,如果字段类型为Int8,传入的值存在NULL,则会报错。



其他

ClickHouse官方文档

https://clickhouse.tech/docs/

右上角可切换语言,建议使用英文。

数据类型、函数等相关说明均可在左侧目录中找到。


    您需要登录后才可以回复