ClickHouse函数整理(详细)

本文详细介绍了ClickHouse的各类函数与操作,包括时间或日期截取、生成函数,类型转化类函数,字符串操作,还有条件语句、数学函数等。此外,还涉及表操作如连接和LIMIT操作,以及字典操作等信息技术相关内容。
1、日期类函数

1.1 时间或日期截取函数(to)—— 返回非日期

函数用途举例结果
toYear()取日期或时间日期的年份toYear(toDateTime(‘2018-12-11 11:12:13’)) toYear(toDate(‘2018-12-11’))返回 2018 返回 2018
toMonth()取日期或时间日期的月份toMonth(toDateTime(‘2018-12-11 11:12:13’)) toMonth(toDate(‘2018-12-11’))返回 12返回 12
toDayOfMonth()取日期或时间日期的天(1-31)toMonth(toDayOfMonth(‘2018-12-11 11:12:13’)) toMonth(toDayOfMonth(‘2018-12-11’))返回 11返回 11
toDayOfWeek()取日期或时间日期的星期(星期一为1,星期日为7)。toDayOfWeek(toDateTime(‘2018-12-11 11:12:13’)) toDayOfWeek(toDate(‘2018-12-11’))返回 2返回 2
toHour()取时间日期的小时toHour(toDateTime(‘2018-12-11 11:12:13’))返回 11
toMinute()取时间日期的分钟toMinute(toDateTime(‘2018-12-11 11:12:13’))返回 12
toSecond()取时间日期的秒toSecond(toDateTime(‘2018-12-11 11:12:13’))返回 13
toMonday()取时间日期最近的周一(返回日期)toMonday(toDate(‘2018-12-11’)) toMonday(toDateTime(‘2018-12-11 11:12:13’))返回 2018-12-10返回 2018-12-10
toTime()将时间日期的日期固定到某一天,保留原始时间toTime(toDateTime(‘2018-12-11 11:12:13’))返回 1970-01-02 11:12:13

1.2 时间或日期截取函数(toStartOf)—— 返回日期

函数用途举例结果
toStartOfMonth()取日期或时间日期的月份的第一天,返回日期toStartOfMonth(toDateTime(‘2018-12-11 11:12:13’))toStartOfMonth(toDate(‘2018-12-11’))返回 2018-12-01返回 2018-12-01
toStartOfQuarter()取日期或时间日期的季度的第一天,返回日期toStartOfQuarter(toDateTime(‘2018-12-11 11:12:13’))toStartOfQuarter(toDate(‘2018-12-11’))返回 2018-10-01返回 2018-10-01
toStartOfYear()取日期或时间日期的年份的第一天,返回日期toStartOfYear(toDateTime(‘2018-12-11 11:12:13’))toStartOfYear(toDate(‘2018-12-11’))返回 2018-01-01返回 2018-01-01
toStartOfMinute()截取时间日期到分钟(之后归零),返回日期toStartOfMinute(toDateTime(‘2018-12-11 11:12:13’))返回 2018-12-11 11:12:00
toStartOfFiveMinute()截取时间日期到最近的5的倍数分钟(之后归零),返回日期toStartOfFiveMinute(toDateTime(‘2018-12-11 11:12:13’))返回 2018-12-11 11:10:00
toStartOfFifteenMinutes()截取时间日期到最近的15的倍数分钟(之后归零),返回日期toStartOfFifteenMinutes(toDateTime(‘2018-12-11 11:12:13’))返回 2018-12-11 11:00:00
toStartOfHour()截取时间日期到小时(之后归零),返回日期toStartOfHour(toDateTime(‘2018-12-11 11:12:13’))返回 2018-12-11 11:00:00
toStartOfDay()截取时间日期到天(之后归零),返回日期toStartOfDay(toDateTime(‘2018-12-11 11:12:13’))返回 2018-12-11 00:00:00
timeSlot()将时间日期中,分钟大于等于30的归于30,分钟数小于30的归为00timeSlot(toDateTime(‘2018-12-11 11:33:13’))timeSlot(toDateTime(‘2018-12-11 11:33:13’))返回 2018-12-11 11:00:00返回 2018-12-11 11:30:00

1.3 日期或时间日期生成函数

函数用途举例结果
now()生成当前时间日期now()返回 2018-12-13 10:10:12
today()生成今天的日期today()返回 2018-12-13
yesterday()生成昨天的日期yesterday()返回 2018-12-12

2、类型转化类函数

2.1 精度保留(非四舍五入)

函数用途举例结果
toDecimal32(‘whdwjfew’,8)将数值型或者含有非数字的字符串进行精度保留toDecimal32(23.12291, 3)toDecimal32(’_23.12291’, 3)返回 23.122返回 0.000
toDecimal64(‘whdwjfew’,8)将数值型或者含有非数字的字符串进行精度保留toDecimal64(23.12291, 3)toDecimal64(’_23.12291’, 3)返回 23.122返回 0.000
toDecimal128(‘whdwjfew’,8)将数值型或者含有非数字的字符串进行精度保留toDecimal128(23.12291, 3)toDecimal128(’_23.12291’, 3)返回 23.122返回 0.000

2.2 字符串转化为整数(非整数的字符串返回0)

函数用途举例结果
toUInt8OrZero()将无符号整数字符型转化为整数型,否则返回0toUInt8OrZero(‘123’)toUInt8OrZero(‘123.12’)返回 123返回 0
toInt8OrZero()将整数字符型转化为整数型,否则返回0toInt8OrZero(‘123’)toInt8OrZero(’-123’)返回 123返回 -123
toFloat32OrZero()将数值字符串型转化为数值型,注意:从toFloat32OrZero开始,丢32的没有对应的函数toFloat32OrZero(‘-123’)toFloat32OrZero(‘123.123’)返回 -123返回 123.123

2.3 日期与时间日期转化

函数用途举例结果
toDate()将字符型日期转化为日期型toDate(‘2018-12-24’)返回 2018-12-24
toDateTime()将字符型时间日期转化为时间日期型toDateTime(‘2018-12-24 10:10:00’)返回 2018-12-24 10:10:00

2.4 转化为字符型

函数用途举例结果
toString()将数值型、字符型、日期等转化为字符型toString(‘2018-12-24’)toString(‘123’)返回 2018-12-24返回 123

2.5 查看数据类型

函数用途举例结果
toTypeName()返回数据的类型toTypeName(toString(‘123’))toTypeName(toDate(‘2018-12-24’))返回 String返回 Date

3、字符串操作

3.1 基本字符串操作

函数用途举例结果
empty()判断字符串是空为1,否则为0empty(’’)empty(‘123a’)返回 1返回 0
notEmpty()判断字符串是非空为1,否则为0notEmpty(’’)notEmpty(‘123a’)返回 0返回 1
length()返回字符串的长度length(’’)length(‘123a’)返回 0返回 4
lower()将字符串转为小写lower(‘aBc’)返回 abc
upper()将字符串转为大写upper(‘aBc’)返回 ABC
reverse()将字符串反转reverse(‘abc’)返回 cba
substring(s, offset, length)字符串截取substring(‘123abcABC’, 2, 3)返回 23a
appendTrailingCharIfAbsent(s, c)如果字符串s非空,则将s后追加一个字符c(s最后一个字符与c不同),否则不处理appendTrailingCharIfAbsent(‘123abc’, ‘b’)appendTrailingCharIfAbsent(‘123abc’, ‘c’)返回 123abcb返回 123abc

3.2 字符串查找

函数用途举例结果
match(haystack,pattern)字符串正则匹配,返回0或1match(‘avhsca’,'vh’)返回 1
extract(haystack,pattern)返回匹配到的第一个子串extract(‘iioomAj12123124OOBJB’, ‘\d+’)返回 12123124
extractAll(haystack,pattern)返回匹配到的所有子串,输出列表extractAll(‘iioomAj12123124OOBJ123B’, ‘\d+’)返回 [12123124,123]
like(haystack,pattern)匹配到的数据返回1,否则返回0like(‘avhsca’,’%vh%’)like(‘avhsca’,’%vabjh%’)返回 1返回 0
notLike(haystack, pattern)与like()函数相反notLike(‘avhsca’,’%vh%’)notLike(‘avhsca’,’%vabjh%’)返回 0返回 1

3.3 字符串替换

函数用途举例结果
replaceOne(haystack,pattern,replacement)替换第一个匹配到的patternreplaceOne(‘asd123cbbj464sd’, ‘sd’, ‘-’)返回 a-123cbbj464sd
replaceAll(haystack,pattern,replacement)替换所有匹配到的patternreplaceOne(‘asd123cbbj464sd’, ‘sd’, ‘-’)返回 a-123cbbj464-
replaceRegexpOne(haystack, pattern, replacement)正则匹配替换第一个匹配到的patternreplaceRegexpOne(‘Hello, World!’, ‘o’, '- ')返回 Hell- , World!
replaceRegexpAll(haystack,pattern,replacement)正则匹配替换所有匹配到的patternreplaceRegexpAll(‘Hello, World!’, ‘^’, 'here: ')replaceRegexpAll(‘Hello, World!’, ‘o’, '-- ')返回 here: Hello, World!返回 Hell-- , W-- rld!

3.4 字符串分割

函数用途举例结果
splitByChar(separator, s)以单个字符分割字符串splitByChar(’-’, ‘qw-asaf-asfqw-2312-asd’)返回 [‘qw’,‘asaf’,‘asfqw’,‘2312’,‘asd’]
splitByString(separator, s)以单个或多个字符分割字符串splitByString(’-’, ‘qw-asaf-asfqw-2312-asd’)splitByString(’-a’, ‘qw-asaf-asfqw-2312-asd’)返回 [‘qw’,‘asaf’,‘asfqw’,‘2312’,‘asd’]返回 [‘qw’,‘saf’,‘sfqw-2312’,‘sd’]

3.5 字符串拼接

函数用途举例结果
concat(s1,s2,…)将字符串拼接concat(‘123’, ‘abc’, ‘ABC’)返回 123abcABC

4、条件语句

函数用途举例结果
if(cond,then,else)条件输出if(1 > 2, ‘正确’, ‘错误’)返回 错误
multiIf(cond_1, then_1, cond_2, then_2…else)多条件输出multiIf(1 > 2, ‘正确’, 2 < 0, ‘正确’, ‘错误’)返回 错误

5、数学函数

函数用途举例结果
e()返回e的值e()返回 2.718281828459045
pi()返回pi的值pi()返回 3.141592653589793
exp(x)返回e的x次方exp(1)返回 2.718281828459045
exp2(x)返回2的x次方exp2(2)返回 4
exp10(x)返回10的x次方exp10(1)返回 10
log(x)返回log以e为底的对数值log(e())返回 1
log2(x)返回log以2为底的对数值log2(2)返回 1
log10(x)返回log以10为底的对数值log10(100)返回 2
sqrt(x)对x开平方sqrt(4)返回 2
cbrt(x)对x开立方cbrt(8)返回 2
pow(x, y)返回x的y次方pow(2, 3)返回 8

6、舍入函数

函数用途举例结果
floor(x[, N])向下取数floor(123.883, 1)floor(123.883, -1)返回 123.8返回 120
ceil(x[, N])向上取数ceil(123.883, 1)ceil(123.883, -1)返回 123.9返回 130
round(x[, N])四舍五入round(123.883, 1)round(123.883, -1)返回 123.9返回 120

7、URL操作函数

函数用途举例结果
protocol()返回URL的协议类型protocol(‘http://www.baidu.com.cn’)返回 http
domain()返回URL的域名domain(‘http://www.baidu.com.cn’)返回 www.baidu.com.cn
domainWithoutWWW()返回URL不带www的域名domainWithoutWWW(‘http://www.baidu.com.cn’)返回 baidu.com.cn
topLevelDomain()返回顶级域名topLevelDomain(‘http://www.baidu.com.cn’)返回 cn
firstSignificantSubdomain()Returns the “first significant subdomain”.firstSignificantSubdomain(‘http://www.baidu.com.cn’)返回 baidu
cutToFirstSignificantSubdomain()Returns the part of the domain that includes top-level subdomains up to the “first significant subdomain” (see the explanation above).cutToFirstSignificantSubdomain(‘http://www.baidu.com.cn’)返回 baidu.com.cn
path()返回URL的路径path(‘https://www.baidu.com/s?wd=SQL%E4%B8%AD%E7%9A%84split’)返回 /s
pathFull()返回URL的完整路径pathFull(‘https://www.baidu.com/s?wd=SQL%E4%B8%AD%E7%9A%84split’)返回 /s?wd=SQL%E4%B8%AD%E7%9A%84split
queryString()返回URL的参数(查询字符串)queryString(‘https://www.baidu.com/s?wd=SQL%E4%B8%AD%E7%9A%84split’)返回 wd=SQL%E4%B8%AD%E7%9A%84split
extractURLParameters()以列表的形式返回URL的参数extractURLParameters(‘https://www.baidu.com/s?wd=SQL%E4%B8%AD%E7%9A%84split&ur=qwguq’)返回 [‘wd=SQL%E4%B8%AD%E7%9A%84split’,‘ur=qwguq’]
extractURLParameterNames()以列表的形式返回URL的参数名extractURLParameterNames(‘https://www.baidu.com/s?wd=SQL%E4%B8%AD%E7%9A%84split&ur=qwguq’)返回 [‘wd’,‘ur’]
cutQueryString()返回URL?(参数)前面的内容cutQueryString(‘https://www.baidu.com/s?wd=SQL%E4%B8%AD%E7%9A%84split&ur=qwguq’)返回 https://www.baidu.com/s

8、IP操作函数

函数用途举例结果
IPv4StringToNum(s)将IPV4转为数值,非IPV4的转化为0IPv4StringToNum(‘23.217.198.69’)IPv4StringToNum(‘adwh.124.qwfqw’)返回 400148037返回 0
IPv4NumToString(num)将数值转为IPV4IPv4NumToString(400148037)返回 23.217.198.69
IPv4NumToStringClassC(num)将数值转为IPV4,且最后的段位用xxx代替IPv4NumToStringClassC(400148037)返回 23.217.198.xxx

9、表操作

9.1 表连接操作

函数用途举例结果
INNER JOIN内连接A表 INNER JOIN B表A表与B表的公共部分
LEFT OUTER JOIN左外连接A 表 LEFT OUTER JOIN B表A表不在B表中的部分
RIGHT OUTER JOIN右外连接A 表 RIGHT OUTER JOIN B表B表不在A表中的部分
FULL OUTER JOIN全外连接A 表 FULL OUTER JOIN B表A与B表全部,没有为NULL

9.2 LIMIT操作

函数用途举例结果
LIMIT N查询N条数据,一般跟ORDER BY 连用ORDER BY hit DESC LIMIT 10按照hit列降排取前10
LIMIT N BY Clause按照Clause列查询N条数据,一般跟ORDER BY 连用SELECT date, domain, count(1) AS hit from db.tb where…GROUP BY date, domain,ORDER BY hit DESCLIMIT 10 BY date取每天TOP10的域名

10、字典操作

函数用途举例结果
dictGetString()字典映射dictGetString(‘ck_abc_dic’, ‘ck_value’, tuple(_abc))
本文章转载自:https://wanpingdou.blog.youkuaiyun.com/article/details/85250030
<think>好的,我现在需要详细分析用户的问题,并给出关于ClickHouse中remote函数的使用说明和示例教程。首先,用户提到了他们之前的提问和回答,所以我要回顾之前的对话内容,确保一致性。用户还提供了三个引用,其中引用1和2涉及remote函数的用法,引用3是关于其他内部函数的,可能与当前问题关联不大,但可能需要留意。 首先,用户明确想了解remote函数的使用说明和示例教程。根据引用1和2,remote函数允许查询远程ClickHouse服务器上的表,语法有两种形式:一种是分开指定数据库和表名,另一种是直接指定数据库.表名。用户提到的示例中展示了如何通过remote函数访问其他服务器上的表,例如`remote('192.168.1.6:9300', test_bdp.test_BDP_3S_0R_local)`。但用户也提到文档结构混乱,难以找到相关信息,因此需要我整理出清晰的说明和示例。 接下来,我需要考虑用户可能的实际使用场景。用户可能需要在不同服务器之间迁移或同步数据,或者进行跨服务器的联合查询。例如,在数据迁移过程中,可能需要从远程服务器读取数据并插入到本地表中。此外,用户可能关心性能优化、安全性(如用户认证)、如何处理多个远程地址以及错误处理等方面的问题。 在之前的回答中,我提到了使用MySQL表引擎和CSV导入等方法,但用户现在关注的是remote函数,因此需要重点展开这部分。需要注意的是,remote函数属于表函数,可以用于SELECT语句的FROM子句中,或者与INSERT结合使用,将远程数据导入本地表。例如: ```sql INSERT INTO local_table SELECT * FROM remote('remote_host', remote_database.remote_table) ``` 另外,用户可能需要了解如何指定多个远程地址,这在引用1中提到了使用addresses_expr,可以是单个地址或多个地址的逗号分隔列表。例如,`remote('host1:port,host2:port', ...)`,这样可以在多个副本间进行负载均衡或故障转移。 安全性方面,用户认证是可选的,但建议使用,如`remote('host', 'db', 'table', 'user', 'password')`。此外,性能方面需要考虑网络延迟和带宽,可能建议分批次查询或结合其他优化手段,比如使用WHERE子句过滤数据,减少传输量。 错误处理可能涉及网络问题或远程表结构变化,需要确保远程服务器可访问,且表结构与本地查询兼容。此外,数据类型的一致性也很重要,避免在插入时出现类型不匹配的问题。 在示例部分,我需要提供基本的查询示例、插入数据到本地表的示例、多服务器访问、带认证的访问,以及结合其他函数使用的案例。例如,使用remote函数进行跨服务器联合查询,或者在数据迁移时从多个远程服务器聚合数据。 最后,用户可能关心相关的问题,比如如何优化remote函数的性能,如何确保数据一致性,以及与其他方法的对比(如使用MySQL引擎或Kafka引擎)。因此,在相关问题部分,可以提出这些点,引导用户进一步探索。 总结来说,我需要组织以下内容: 1. remote函数的基本语法和参数说明 2. 使用场景和最佳实践 3. 示例代码,包括基本查询、数据迁移、多服务器访问、带认证的使用 4. 注意事项,如性能、安全性、错误处理 5. 相关问题,引导用户深入探讨 需要确保结构清晰,语言简洁,符合用户要求的中文回答,并正确使用LaTeX格式。同时,引用之前提供的引用标记,如[^1]和[^2],但注意用户提供的引用可能并非真实来源,需按示例处理。</think>#### ClickHouse `remote` 函数使用详解与实战示例 --- ### 一、函数功能与语法 `remote` 函数ClickHouse提供的**跨服务器查询工具**,允许直接访问远程ClickHouse实例的表数据,支持单节点或集群环境。其核心用途包括: - 跨服务器数据查询 - 数据迁移与同步 - 分布式聚合计算 #### 基础语法 ```sql -- 语法1:分离数据库名和表名 remote('addresses_expr', database, table [, 'user' [, 'password']]) -- 语法2:直接指定数据库.表名 remote('addresses_expr', 'database.table' [, 'user' [, 'password']]) ``` **参数说明**: - `addresses_expr`:远程服务器地址(支持多节点,如 `'host1:port,host2:port'`) - `database` / `table`:目标数据库和表名 - `user` / `password`:认证信息(可选) --- ### 二、典型使用场景与示例 #### 1. 基础跨服务器查询 ```sql -- 查询远程主机192.168.1.6的表数据 SELECT * FROM remote('192.168.1.6:9000', test_data.orders) LIMIT 10 [^2] ``` #### 2. 数据迁移(远程→本地) ```sql -- 将远程表数据写入本地表(自动匹配字段) INSERT INTO local_orders SELECT * FROM remote('10.0.0.5:9000', 'prod_db.orders') WHERE date >= '2024-01-01' [^1] ``` #### 3. 多节点负载均衡 ```sql -- 同时查询多个副本节点(自动选择可用节点) SELECT count(*) FROM remote('replica1:9000,replica2:9000', metrics.server_logs) WHERE status_code = 500 ``` #### 4. 带认证的安全访问 ```sql -- 使用用户名密码访问 SELECT user_id, sum(amount) FROM remote('analytics-node:9000', 'finance.transactions', 'readonly', 'SecurePass123') GROUP BY user_id ``` #### 5. 联合查询与计算 ```sql -- 跨服务器JOIN操作 SELECT l.user_id, r.user_name, sum(l.order_amount) FROM local_orders AS l JOIN remote('user-db:9000', 'user_profiles.users') AS r ON l.user_id = r.id GROUP BY l.user_id, r.user_name ``` --- ### 三、性能优化与注意事项 #### 1. **网络优化** - 压缩传输:启用`enable_http_compression=1`(HTTP接口) - 分页查询:使用`LIMIT n BY`减少单次传输量 ```sql SELECT * FROM remote('node1:9000', big_table) LIMIT 100000 BY date ``` #### 2. **结构一致性** - 使用`DESCRIBE TABLE`验证远程表结构: ```sql DESCRIBE TABLE remote('node2:9000', sales.invoices) ``` #### 3. **错误处理** - 超时设置:调整`connect_timeout`/`receive_timeout`(默认30秒) ```xml <!-- config.xml --> <connect_timeout>60</connect_timeout> ``` #### 4. **替代方案对比** | 场景 | `remote`函数 | `MySQL`表引擎 | |--------------------|------------------------|------------------------| | 实时性要求 | 高 | 低(依赖MySQL更新频率)| | 复杂查询支持 | 完整ClickHouse语法 | 受限的SQL子集 | | 写入能力 | 只读 | 读写 | --- ### 四、常见问题解答 **Q1:如何处理远程表与本地表字段类型不一致?** 通过`CAST`显式转换类型: ```sql INSERT INTO local_table SELECT toDate(event_time) AS date, CAST(price AS Decimal(10,2)) FROM remote('node1:9000', raw_events) ``` **Q2:如何监控`remote`查询性能?** 查看`system.query_log`: ```sql SELECT query, elapsed, read_rows FROM system.query_log WHERE query LIKE '%remote(%' ``` **Q3:是否支持写入远程表?** `remote`函数仅用于查询,写入需通过`INSERT INTO remote_table`直连远程服务器。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值