Azure Stream Analytics中如何用CSV参考数据实现正则匹配查询?
在Azure Stream Analytics中实现正则匹配参考数据的可行方案
我之前处理过类似的需求,给你分享几个实用的方法,帮你解决这个匹配问题:
方法1:把正则转成ASA LIKE支持的格式,直接用JOIN
先看你的参考数据里的正则,其实可以简化成ASA的LIKE操作符能识别的格式:
- 原正则
115[1-2]{1}9里的{1}是冗余的,直接写成115[1-2]9就行 - 同理
115[3-9]{1}9简化为115[3-9]9
ASA的T-SQL LIKE是支持字符范围匹配的(比如[1-2]、[a-z]这种写法都能识别),所以你可以直接用JOIN结合LIKE来实现匹配,完全不需要复杂的UDF:
SELECT e.*, r.FRIENDLY_NAME INTO [你的输出目标] FROM [EventHub输入流] e JOIN [Blob参考数据源] r ON e.要匹配的属性名 LIKE r.REGEX_PATTERN
如果你的正则有更复杂的语法(比如通配符*、重复次数+、分组这些),这个方法可能hold不住,那可以试试下面的方法。
方法2:用JavaScript UDF结合参考数据做正则匹配
要是你的正则语法超出了LIKE的能力范围,就可以用ASA的JavaScript用户定义函数(UDF),而且可以在UDF里直接调用参考数据来做匹配:
第一步:创建JavaScript UDF
先建一个叫GetFriendlyName的UDF,逻辑很简单:接收事件里的属性值,再接收参考数据的数组,遍历每个正则模式,找到匹配的就返回对应的友好名:
function main(inputValue, referenceData) { for (var i = 0; i < referenceData.length; i++) { var pattern = new RegExp(referenceData[i].REGEX_PATTERN); if (pattern.test(inputValue)) { return referenceData[i].FRIENDLY_NAME; } } return "Unknown"; // 没匹配到的时候返回默认值 }
第二步:在查询里调用这个UDF
在ASA的查询中,你需要先用Collect函数把所有参考数据行聚合成一个数组,然后和事件流做交叉连接,再调用UDF就行:
WITH ReferenceDataArray AS ( SELECT Collect() AS RefData FROM [Blob参考数据源] ) SELECT e.*, udf.GetFriendlyName(e.要匹配的属性名, r.RefData) AS FRIENDLY_NAME INTO [你的输出目标] FROM [EventHub输入流] e CROSS JOIN ReferenceDataArray r
注意哦,这个方法适合参考数据量不大的场景,因为Collect会把所有参考数据加载到内存里,如果数据量太大,可能会影响作业性能。
方法3:提前预处理参考数据(可选优化)
如果你的参考数据是静态的或者很少更新,那可以提前把正则模式转换成ASA能直接处理的格式,甚至提前把所有可能的匹配值和友好名的映射关系整理好,存到Blob或者SQL数据库里,这样在ASA查询中直接用等值JOIN,性能会好很多。
内容的提问来源于stack exchange,提问作者user_name
相关产品推荐
相关产品推荐

