Hive可正常运行的正则在SparkSQL执行时报dangling metacharacter *错误
SparkSQL执行Hive兼容正则时报悬空元字符错误
问题复现
- 同一套正则逻辑在Hive环境下可正常运行,迁移到SparkSQL环境执行时抛出正则解析错误
- 报错具体内容:
dangling metacharacter * at index 3 - 触发报错的执行SQL语句:
select regexp_extract('a|b||c','^(\\|*(?:(?!\\|\\|\\w(?!\\|\\|)).)*)'); - 已开展的排查尝试:对正则中的元字符
*使用\\*做转义后重试,仍然抛出完全相同的悬空元字符报错。
报错根因
- 报错标记的index 3位置,对应正则字符串中紧跟在转义竖线后的第一个
*量词 - 核心差异是两个引擎对SQL字符串的正则转义层级处理规则不一致:
- Hive解析正则时会经过两层字符串转义解码,原本写的
\\|会被正确解析为正则引擎需要的转义竖线\|,搭配后续的*量词可正常匹配 - SparkSQL底层依赖Java正则库完成解析,对SQL字面量的转义解码仅做一层处理,原本写的
\\|*解码后实际传递给正则引擎的内容为|*——也就是正则表达式刚开头就出现了没有前置匹配主体的*量词,直接触发悬空元字符校验失败
- Hive解析正则时会经过两层字符串转义解码,原本写的
- 之前尝试的
\\*转义操作失效,本质是转义层级错配:本来要在正则层给*增加转义,结果在SQL字符串解码阶段就被转换成普通字符,根本没传递到正则解析环节。
修正方案
- 适配SparkSQL的转义层级规则,对所有需要正则层转义的竖线字符额外增加一层SQL字符串转义,让最终解码后的内容完全匹配正则引擎的解析要求
- 修正后可正常执行的语句:
select regexp_extract('a|b||c','^(\\\\|*(?:(?!\\\\|\\\\|\\w(?!\\\\|\\\\|)).)*)');
内容的提问来源于stack exchange,提问作者Priya
相关产品推荐
相关产品推荐

