sql正则提取固定内容

regexp_extract

语法: regexp_extract(string subject, string pattern, int index)

返回值: string

说明: 将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

  • 第一参数string subject: 要处理的字段
  • 第二参数string pattern: 需要匹配的正则表达式
  • 第三个参数int index:
    0是显示与之匹配的整个字符串
    1 是显示第一个括号里面的
    2 是显示第二个括号里面的字段…

使用示例
select

regexp_extract(‘x=a3&x=18abc&x=2&y=3&x=4’,‘x=([0-9]+)([a-z]+)’,0), – x=18abc

regexp_extract(‘x=a3&x=18abc&x=2&y=3&x=4’,‘^x=([a-z]+)([0-9]+)’,0), – x=a3

regexp_extract(‘https://detail.tmall.com/item.htm?spm=608.7065813.ne.1.Ni3rsN&id=522228774076&tracelog=fromnonactive’,‘id=([0-9]+)’,0), – id=522228774076

regexp_extract(‘https://detail.tmall.com/item.htm?spm=608.7065813.ne.1.Ni3rsN&id=522228774076&tracelog=fromnonactive’,‘id=([0-9]+)’,1), – 522228774076

regexp_extract(‘http://a.m.taobao.com/i41915173660.htm’,‘i([0-9]+)’,0), – i41915173660

regexp_extract(‘http://a.m.taobao.com/i41915173660.htm’,‘i([0-9]+)’,1) – 41915173660

select regexp_extract(‘hitdecisiondlist’,‘(i)(.*?)(e)’,0) ;

结果:itde

select regexp_extract(‘hitdecisiondlist’,‘(i)(.*?)(e)’,1) ;

结果:i

select regexp_extract(‘hitdecisiondlist’,‘(i)(.*?)(e)’,2) ;

结果:td

select regexp_extract(‘x=a3&x=18abc&x=2&y=3&x=4’,‘x=([0-9]+)([a-z]+)’,2) from default.dual;

结果:abc

提取固定数字

提取没有清洗数值中的数字部分

存在没有清洗的数值value
1、示例内容:
‘身份证号 : 0123456789876543210,完毕’
由 汉字+标点+数字+标点+汉字 组成
2、我们只想提取其中部分数字内容

select regexp_extract('身份证号 : 0123456789876543210,完毕','.*([0-9]{19}).*',1)
  • .* :代表任意多次匹配任意值
  • [0-9]:代表从0-9数字中匹配
  • {19}:代表匹配19次

返回:

0123456789876543210

提取手机号

select regexp_extract('身份证号 : 0123456789876543210,完毕,手机号:13012341234','.*([1][35678][0-9]{9}).*$',1)
  • 手机号是规则的,11位,并且1开头[35678]是第二位
  • [35678]:代表手机号的第二位,也可自行修改
  • [0-9]:代表匹配0-9数字
  • {9}:代表剩余的9位数字匹配九次

返回:

13012341234

split_part

select split_part (‘/abc/required_string/2/’, ‘/’, 3)
返回:required string

SUBSTRING_INDEX

select 
SUBSTRING_INDEX('#住宿和餐饮业#餐饮业#餐饮#河北省#保定市#雄县', '#', 2),
SUBSTRING_INDEX(SUBSTRING_INDEX('#住宿和餐饮业#餐饮业#餐饮#河北省#保定市#雄县', '#', 2), '#', -1) AS result,
SUBSTRING_INDEX('#住宿和餐饮业#餐饮业#餐饮#河北省#保定市#雄县', '#', 3),
SUBSTRING_INDEX(SUBSTRING_INDEX('#住宿和餐饮业#餐饮业#餐饮#河北省#保定市#雄县', '#',3), '#', -1) AS result2
"_c0"	"result"	"_c2"	"result2"
"#住宿和餐饮业"	"住宿和餐饮业"	"#住宿和餐饮业#餐饮业"	"餐饮业"
<think>首先,用户的问题是:“我想查找Spark SQL中进行模糊查询的正则表达式相关内容 请问Spark SQL模糊查询的正则表达式”。用户明确要求关于Spark SQL中进行模糊查询的正则表达式内容。 从系统指令中,我需要: - 使用中文回答。 - 所有行内数学表达式使用$...$格式(但这里可能不涉及太多数学)。 - 独立公式使用$$...$$并单独成段(但问题可能不涉及公式)。 - LaTeX语法正确(如果使用)。 - 生成相关问题(在最后)。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户提供了几个引用: - 引用[1]:关于Hql和SparkSql正则关键字的使用,如like, rlike, regexp, regexp_replace, regexp_extract。 - 引用[2]:关于使用Spark SQL查询Databricks的指南。 - 引用[3]:工作中遇到的Spark SQL问题,比较like, instr, regexp的性能和用法。 - 引用[4]:SQL模糊查询,包括regexp的用法。 用户的查询是模糊查询的正则表达式相关内容,我应参考这些引用来构建回答。 关键点从引用中提取: - 从引用[1]:Spark SQL支持的正则关键字包括LIKE, RLIKE, REGEXP, REGEXP_REPLACE, REGEXP_EXTRACT。 - 从引用[3]:比较了LIKE, INSTR, REGEXP;REGEXP用于正则表达式匹配。 - 从引用[4]:REGEXP的语法,如.匹配任何单个字符,[...]匹配字符类,*匹配零或多个,|用于多个条件。 用户的问题是Spark SQL模糊查询的正则表达式,所以我应该聚焦在REGEXP或RLIKE运算符上。 在Spark SQL中,正则表达式模糊查询通常使用RLIKE或REGEXP关键字。引用中提到: - 引用[1]:有RLIKE和REGEXP。 - 引用[3]:使用了WHERE QD REGEXP "线上化"。 - 引用[4]:REGEXP的语法。 我应该解释如何在Spark SQL中使用正则表达式进行模糊查询,包括语法、示例和注意事项。 结构化回答: 1. **介绍**:简要介绍Spark SQL中支持正则表达式模糊查询的运算符。 2. **语法和用法**:解释REGEXP或RLIKE的语法,从引用中提取关键点。 3. **示例**:提供一些代码示例。 4. **性能考虑**:从引用[3],提到性能差异。 5. **与其他操作符比较**:简要与LIKE和INSTR比较。 6. **总结**:建议使用场景。 7. **相关问题生成**:在最后添加相关问题。 引用标识:在回答中,当引用具体内容时,末尾添加[^n]。例如: - "REGEXP用于正则表达式匹配[^3]。" 这样。 使用中文回答。 可能的回答大纲: - **Spark SQL中的正则表达式模糊查询**:使用RLIKE或REGEXP关键字。 - 语法:基于引用[4],如"."匹配任意字符,"[...]"匹配字符类,"*"匹配零或多个等。 - 示例:WHERE column REGEXP 'pattern'。 - 支持的关键字:从引用[1],有REGEXP_REPLACE和REGEXP_EXTRACT用于更高级的操作。 - 性能:REGEXP性能可能较差,如引用[3]所述。 - 比较:LIKE简单但有限,REGEXP更强大但更慢。 生成相关问题: - 基于主题,如性能优化、其他函数、应用场景等。 完整回答: - 开头直接回答问题。 - 结构清晰。 - 结束时添加相关问题。 </think>### Spark SQL模糊查询的正则表达式使用指南 在Spark SQL中,正则表达式(Regex)是进行复杂模糊查询的强大工具,特别适用于模式匹配、字符串搜索和数据过滤。核心关键字是`RLIKE`和`REGEXP`(两者功能等效),以及辅助函数如`REGEXP_REPLACE`和`REGEXP_EXTRACT`。以下基于您的引用内容,我将逐步解释使用方法、语法、示例和注意事项,确保回答清晰可靠。 #### 1. **正则表达式模糊查询的核心关键字** - **RLIKE 和 REGEXP**:这两个关键字用于在`WHERE`子句中执行正则表达式匹配。如果字符串匹配指定模式,则返回`true`。 - 语法:`WHERE column_name RLIKE 'pattern'` 或 `WHERE column_name REGEXP 'pattern'`,其中`pattern`是正则表达式。 - 例如,查找包含“线上化”的字符串:`WHERE QD REGEXP '线上化'`[^3]。 - 优势:支持复杂模式匹配(如字符类、量词),而简单的`LIKE`操作符(如`LIKE '%线上化%'`)只能处理通配符`%`和`_`,功能有限[^1][^3]。 - **REGEXP_REPLACE 和 REGEXP_EXTRACT**:这些函数用于字符串处理。 - `REGEXP_REPLACE(column, 'pattern', 'replacement')`:替换匹配模式的子字符串。 - `REGEXP_EXTRACT(column, 'pattern')`:提取匹配模式的子字符串。 - 例如,提取电话号码:`REGEXP_EXTRACT(phone, '\\d{3}-\\d{4}')`[^1]。 #### 2. **正则表达式语法详解** Spark SQL正则表达式基于标准正则语法(类似Perl风格),以下是常见符号及其含义(引用[4]提供了基础描述): - **基本匹配符号**: - `.`:匹配任何单个字符(例如,`a.c`匹配“abc”或“axc”)。 - `[...]`:字符类,匹配方括号内的任何字符(例如,`[abc]`匹配“a”、“b”或“c”;`[0-9]`匹配任何数字)。 - `[^...]`:否定字符类,匹配不在方括号内的字符(例如,`[^abc]`匹配除“a”、“b”、“c”外的字符)。 - **量词和分组**: - `*`:匹配零个或多个前面的元素(例如,`a*`匹配“a”、“aa”或空字符串)。 - `+`:匹配一个或多个前面的元素(例如,`a+`匹配至少一个“a”)。 - `?`:匹配零个或一个前面的元素。 - `|`:逻辑OR,匹配多个模式之一(例如,`cat|dog`匹配“cat”或“dog”)。 - `()`:分组元素(例如,`(ab)+`匹配“ab”、“abab”等)。 - **锚点和转义**: - `^`:匹配字符串开头(例如,`^start`匹配以“start”开头的字符串)。 - `$`:匹配字符串结尾(例如,`end$`匹配以“end”结尾的字符串)。 - `\\`:转义特殊字符(例如,`\\.`匹配点号“.”)。 正则表达式的运算优先级从高到低依次为:括号`()` > 量词`*`, `+`, `?` > 序列 > 逻辑`|`[^4]。 #### 3. **代码示例** 以下示例基于Spark SQL语法,可在Databricks或PySpark中运行: ```sql -- 示例1:基本匹配(查找包含"线上化"的字符串) SELECT * FROM table_name WHERE column RLIKE '线上化'; -- 示例2:使用字符类和量词(查找以数字开头、结尾为"化"的字符串) SELECT * FROM table_name WHERE column REGEXP '^[0-9].*化$'; -- 示例3:使用REGEXP_REPLACE(将"test"替换为"demo") SELECT REGEXP_REPLACE(column, 'test', 'demo') AS new_column FROM table_name; -- 示例4:使用REGEXP_EXTRACT(提取邮箱域名) SELECT REGEXP_EXTRACT(email, '@([a-z]+\.[a-z]+)') AS domain FROM table_name; ``` #### 4. **性能考虑** - REGEXP/RLIKE的性能通常比LIKE和INSTR差,因为它们涉及更复杂的计算(如回溯匹配)。引用[3]指出: - `LIKE '%线上化%'`:尽管性能较差(因`%`开头的通配符无法用索引优化),但对于简单模糊查询足够高效。 - `REGEXP '线上化'`:计算开销更大,尤其在处理大数据集时(如TB级数据),可能导致查询变慢[^3]。 - **优化建议**: - 对于简单模式(如固定字符串),优先使用`LIKE`或`INSTR`(例如,`WHERE INSTR(QD, '线上化') <> 0`)。 - 对于复杂模式,使用REGEXP时添加前缀锚点(如`^pattern`)以提高效率。 - 在Spark集群中,开启分区和缓存策略可减轻性能影响[^2]。 #### 5. **与其他模糊查询操作符的比较** - **LIKE vs REGEXP**: - LIKE:只支持通配符`%`(任意字符)和`_`(单字符),语法简单但功能有限。 - REGEXP:支持全功能正则表达式,适合复杂场景(如匹配特定格式的邮箱或日期)。 - **INSTR vs REGEXP**: - INSTR:返回子字符串位置(如`INSTR(QD, '线上化') > 0`),性能中等但不支持模式匹配。 - REGEXP:更灵活,但资源消耗更高。 总结:根据需求选择—简单匹配用LIKE,位置检索用INSTR,复杂模式用REGEXP[^3][^4]。 #### 6. **使用注意事项** - **区分大小写**:Spark SQL默认不区分大小写(如`'A'`匹配“a”)。如需区分,可使用`RLIKE BINARY 'pattern'`[^4]。 - **兼容性**:Spark SQL的语法与Hive SQL兼容,适用于大数据平台如Databricks[^1][^2]。 - **错误处理**:无效正则表达式会抛出异常,建议先在工具中测试模式。 正则表达式在Spark SQL中提供了强大的模糊查询能力,特别适合日志分析、数据清洗等场景。如果您有具体的模式或数据样例,我可以进一步优化示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值