"Regex for Rows": Simplifying Pattern Detection in SQL with MATCH_RECOGNIZE
TL;DR · AI 摘要
Databricks推出的MATCH_RECOGNIZE操作符通过正则表达式语法简化了SQL中的序列检测,可有效识别登录异常和股票趋势等跨行业场景。
核心要点
- MATCH_RECOGNIZE是Databricks新推出的SQL操作符,支持在公共预览版中使用
- 在网络安全场景中可检测5次失败登录后成功登录的异常模式
- 金融分析中能通过V型趋势检测识别股票价格反转
结构提纲
按章节快速跳转。
- §引言
介绍MATCH_RECOGNIZE操作符解决传统SQL序列检测难题的核心价值
- ·核心机制
通过正则表达式语法实现事件序列模式匹配,替代复杂的时间窗口计算
检测连续失败登录后成功登录的异常行为,使用FIRST()函数锚定时间窗口
识别股票价格V型反转趋势,通过模式匹配发现价格逆转信号
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- MATCH_RECOGNIZE应用
- 核心优势
- 简化序列检测语法
- 动态时间窗口处理
- 行业应用
- 网络安全-登录异常检测
- 金融分析-股票趋势识别
金句 / Highlights
值得收藏与分享的关键句。
MATCH_RECOGNIZE通过FIRST(FAIL.event_time)直接锚定初始失败时间戳,实现动态时间窗口检测
传统COUNT()窗口函数无法有效隔离序列中的成功登录事件,导致误判风险
金融分析师使用MATCH_RECOGNIZE可精准捕捉股票价格的V型反转形态
使用 MATCH_RECOGNIZE 简化模式检测 | Databricks 博客
跳至主要内容
产品
2026年9月16日
“行的正则表达式”:使用 MATCH_RECOGNIZE 简化 SQL 中的模式检测
在任何需要处理序列的场景中(从股市趋势到传感器故障等),都可以使用 MATCH_RECOGNIZE。
作者:Kent Marten 和 Sergei Fedorov
摘要
- MATCH_RECOGNIZE 是一种新的 SQL 操作符,目前处于公开预览版,允许您从事件数据中检测模式和序列。
- MATCH_RECOGNIZE 使用类似正则表达式的模式匹配。
- MATCH_RECOGNIZE 在多个行业中具有高度实用性,包括:金融服务、网络安全、电子商务和制造/IoT。
想象一下您在网络安全领域工作,拥有一张跟踪登录尝试的表格。该表格将每次登录尝试标记为成功或失败,并记录尝试发生的时间。您想要发现异常的登录模式,可能会提出这样的问题:“哪些用户经历了连续登录失败后紧接着成功的情况?”使用标准 SQL 查找此类可疑活动颇具挑战性。SQL 将行视为没有时间线的无序事实集合,本身没有事件序列的固有概念。
虽然您可以按用户统计失败登录次数,但单纯的计数无法帮助您判断这些尝试是否集中在短时间内还是分散在整个月内;也无法告诉您成功登录是否紧随失败之后。要在 SQL 中实现这一点,您最终会得到一个复杂的查询,需要将多个通用表表达式串联起来,将时间窗口锚定到第一次失败,然后检查后续每一行。
MATCH_RECOGNIZE 简化了这一过程。现在在 Databricks 计算(包括 Lakehouse Real-Time)中可用,MATCH_RECOGNIZE 让您可以直接描述关心的序列,就像为行编写正则表达式一样。现在只需一个 SQL 子句即可处理模式匹配,您不再需要依赖“间隙和岛屿”逻辑的复杂 SQL。
让我们通过具体行业案例,看看 MATCH_RECOGNIZE 如何在不同行业中简化序列检测。
网络安全:识别可疑登录异常
如果您正在授权日志中搜索凭证填充攻击,单纯统计登录尝试次数可能导致误报。您需要特别检测高频尖峰,例如特定短时间内(如 5 次或更多)连续失败登录后立即成功登录的情况。
标准的 COUNT() OVER (PARTITION BY user_id ORDER BY event_time) 窗口函数可以告诉您某个时间段内失败次数,但无法轻松将滑动时间窗口锚定到特定序列中的首次失败,也无法在成功发生后清晰隔离该序列。
使用 MATCH_RECOGNIZE 时,您可以在 DEFINE 块中直接使用 FIRST(FAIL.event_time) 来锚定首次失败尝试的时间戳。每个后续的 FAIL 事件都会被动态检查,确保其发生在首次尝试后的 1 小时内,之后才会转换到 SUCCESS 状态。
$
/$
金融分析:检测 V 型股票趋势
/think
每个市场数据分析师都关注价格反转,即股票价值下跌后突然回升的时刻。这种形态被称为“V形”,在标准SQL中识别这种形态需要使用一种名为“间隔和孤岛”的技术:由于SQL本身没有趋势的概念,你必须首先手动将行划分为“孤岛”(价格持续向同一方向移动的连续区间),才能进一步确定V形的起始和结束位置。
实际上,这意味着使用LAG和LEAD函数将每一行与其相邻行进行比较,构建一个运行计数器,每当方向发生变化时计数器递增(从而为每个孤岛分配一个组ID),然后编写HAVING过滤器来确认每个孤岛的形态和边界。仅仅为了回答一个简单的问题“价格何时下跌并恢复”,就需要搭建大量支撑结构。
MATCH_RECOGNIZE子句消除了这种支撑结构的需求。你只需按符号对数据进行分区,按时间排序,然后将V形趋势的形态定义为类似正则表达式的状态序列。
电商:检测结账弃购
产品经理希望找到有高购买意向但从未完成购买的用户。那些表现出真实购买意图但随后消失的用户是一个有价值的信号。识别这类用户有助于:确定需要发送提醒的用户群体,轻松衡量机会规模和通过后续行动可挽回的百分比,并与该群体中的其他用户进行对比,发现新洞察(例如某产品定价过高)。高价值失败转化漏斗追踪的用户包括:
- 查看产品页面两次或更多次(VIEW 2次或更多次,表明高度兴趣)
- 将商品加入购物车(ADD_TO_CART)
- 最终放弃会话(使用时间过滤器)
最后一步不是基于某个值,而是基于用户活动的时间范围。没有“弃购”行可供匹配或“结账错误”,用户只是突然停止活动。在传统SQL中,你需要通过NOT EXISTS子查询、自连接和窗口函数来证明负向条件,以显示在商品被加入购物车后没有发生任何事情,并且已经过了足够长的空闲时间以判定购物车被放弃。
MATCH_RECOGNIZE可以直接使用分区结束锚点$来表达“之后没有发生任何事情”,这强制要求购物车添加操作成为会话中的最后一个记录事件。添加一个空闲窗口的时间过滤器,你就能创建一个无需自连接的基于超时的弃购规则。
制造业/物联网:从传感器数据预测设备故障
预测性维护依赖于识别趋势和模式。任何机器在运行时,其内部温度通常会上升,但持续的温度上升后出现振动峰值可能预示着即将发生的故障。
传统SQL需要逐行滚动比较来持续检测危险趋势。MATCH_RECOGNIZE原生支持逐行逻辑。在DEFINE子句中,你可以使用PREV和NEXT函数(功能类似于LAG和LEAD)。这意味着设置温度上升规则只需简单编写temperature > PREV(temperature)。
今天就在Lakehouse上尝试Match Recognize
现在比以往任何时候都更容易发现数据模式并简化事件序列分析。MATCH_RECOGNIZE允许你以更符合逻辑的方式编写更少的代码进行模式匹配。该子句更易于验证、维护和更新。
- 查阅文档:深入阅读官方 SQL 参考文档,了解高级模式语法、量词和度量聚合函数的使用方法。
- 在您的工作区尝试:在 Databricks SQL 或 Lakehouse//RT 中,使用您自己的日志流、点击流会话或时间序列遥测数据测试上方的示例。
- 迁移遗留流水线:识别最复杂的窗口函数和自连接 CTE,让 Genie Code 协助您用更简洁的 MATCH_RECOGNIZE 查询进行重写。
最好的数据仓库是 Lakehouse。我们的原生功能持续扩展,使您能够在单一统一平台上进行更强大的分析。
订阅获取最新文章
订阅我们的博客,最新文章将直接发送到您的邮箱。
立即订阅
查看所有博客
slice-start id="_gatsby-scripts-1"
slice-end id="_gatsby-scripts-1"