如何使用Databricks regex_extract提取日志中的schema.table_name
问题
需要从格式为2022.11.07T00:00:00.0000 | log_info schema.table_name... [ hh.mm.ss ]的日志中,提取唯一符合word.word格式的schema.table_name。目前用嵌套的split_part语句能得到子串“log_info schema.table_name...”,但希望用Databricks的regex_extract(基于Java正则)实现更简洁的提取,直接拿到第一个点前后的单词组合。
之前的split_part实现代码:
SELECT split_part(split_part(message, '|', 2), '[', 1) FROM (SELECT '2022.11.07T00:00:00.0000 | log_info schema.table_name... [ hh.mm.ss ]' as message)
解决方案
用regex_extract可以一步到位提取目标内容,直接匹配符合word.word格式且被日志上下文包围的字符串。具体SQL语句如下:
SELECT regex_extract(message, '\\b(\\w+\\.\\w+)\\b', 1) AS schema_table FROM (SELECT '2022.11.07T00:00:00.0000 | log_info schema.table_name... [ hh.mm.ss ]' as message)
正则表达式说明
\\b:匹配单词边界,避免误匹配日志里其他带点的内容(比如开头的时间、结尾的hh.mm.ss)(\\w+\\.\\w+):捕获组,匹配由字母、数字、下划线组成的两个单词,中间用点连接,正好对应schema.table_name的格式- 参数
1:指定提取第一个捕获组的内容,也就是我们需要的word.word格式字符串
如果日志中存在多个类似格式的字符串,regex_extract默认会返回第一个匹配到的结果,刚好满足提取唯一目标的需求。
内容的提问来源于stack exchange,提问作者Robert Riley
相关产品推荐
相关产品推荐

