在使用鸿鹄进行数据分析的过程中经常会使用正则表达式来抽取字段。通常情况下,在添加了正则表达式抽取规则后,查询性能不会有非常大的性能下降。
如果原来查询需要1秒的时间,添加了正则表达式抽取规则之后同样的查询需要10秒左右的时间,那么需要检查正则表达式本身是否有性能问题。
下面以解析 Istio access log日志为例,看看如何发现问题并优化正则表达式。
案例
例如有如下 Istio 的 access log:
用如下正则表达式去抽取字段:
在鸿鹄中测试1000条 events 的解析,总共用了15秒,比没有配置正则抽取时(少于1秒)性能下降明显,这种情况下需要检查正则表达式本身是否存在问题。
用 regex101.com 去测试上述正则表达式,会得到该正则表达式包含灾难性回溯的提示:
改写正则表达式,避免回溯。(在包含.+的 capture group 中加上?使匹配规则变成懒惰匹配)
同样的1000条 events 的解析时间是0.095秒:
总结
在使用正则表达式抽取字段的时候,如果觉得性能下降明显,可以采用如下方式进一步分析排查:
-
采用在线工具比如regex101.com 对正则表达式作初步测试
-
结合鸿鹄内置的表函数(Table Function)generate_series对数据解析性能做进一步评估