项目中需要从URL字段中提取音视频文件名称并进行计数,其中URL的内容类似于:https://webfs.tx.kugou/202203210816/146848c288decee8d51316d86a7f2d6c/part/0/960117/KGTX/CLTX001/2c7ceb6cc2340ecc8948e0ace62f0cf8.mp3,要提取出的信息是2c7ceb6cc2340ecc8948e0ace62f0cf8.mp3,使用正则表达式当然很好提取,问题是如何在clickhouse中使用呢?查阅一番资料,发现不负所望,clickhouse提供了这样的函数。

extract(haystack, pattern)

官方说明:从指定的字符串中按照pattern正则提取数据,如果无法匹配正则表达式则返回空。如果正则中不包含子模式,则返回匹配到整个表达式的内容,否则返回匹配到第一个子模式的片段。

以文章开头的需求为例,只要确定好正则表达式之后,即可直接使用:

select extract('https://webfs.tx.kugou/202203210816/146848c288decee8d51316d86a7f2d6c/part/0/960117/KGTX/CLTX001/2c7ceb6cc2340ecc8948e0ace62f0cf8.mp3','.*/(.*.mp3)$');

结果如图:

extractAll(haystack, pattern)

对于匹配到多个结果的情况,建议使用该方法,返回的是一个数组。详细的使用要求同上面的extract函数。
我随便举个例子吧,从一个指定的字符串中提取数字部分,可使用sql如下:

select extractAll('hello 123,good 456','\d+');

结果如图:

拓展知识

在查阅官方手册的过程中发现,其实clickhouse有很多专门的针对URL内容字段的处理函数,比如提取主机域名的方法,提取请求参数的方法等,还是十分方便的。详情可参考:https://clickhouse/docs/en/sql-reference/functions/url-functions/

更多推荐

在clickhouse中使用正则表达式提取字段信息的方法