Hive SQL 精进系列:REGEXP 函数的用法



一、引言

当处理复杂的文本数据时,常常需要对字符串进行模式匹配和筛选,Hive SQL 中的 REGEXP 函数就提供了这样的功能。它基于正则表达式实现字符串的模式匹配,能高效地从海量文本数据中提取所需信息。本文将详细介绍 REGEXP 函数的基本概念、语法、常见应用场景及高级用法。

二、REGEXP 函数基础

2.1 基本概念

正则表达式(Regular Expression)是一种用于描述字符串模式的工具,通过特定的字符和规则组合,能够精确地定义我们想要匹配的字符串模式。REGEXP 函数则是 Hive SQL 中利用正则表达式进行字符串匹配的函数。

2.2 语法结构

在 Hive SQL 中,REGEXP 函数主要有两种常见的使用方式:

作为运算符使用
string_expression REGEXP pattern

此形式用于判断 string_expression 是否匹配 pattern 所定义的正则表达式模式。若匹配,返回 TRUE;否则返回 FALSE

WHERE 子句中使用
SELECT column1, column2, ...
FROM table_name
WHERE column_name REGEXP pattern;

该形式用于筛选出 column_name 列中符合 pattern 正则表达式模式的记录。

2.3 参数说明

  • string_expression:需要进行匹配的字符串表达式,可以是表中的列名,也可以是字符串常量。
  • pattern:正则表达式模式,由一系列字符和元字符组成,用于定义我们想要匹配的字符串规则。
  • column_name:表中的列名,用于指定要进行匹配操作的列。

2.4 简单示例

假设我们有一个 users 表,包含 idemail 两列,现在要找出 email.com 结尾的用户记录。

-- 创建示例表
CREATE TABLE users (id INT,email STRING
);-- 插入示例数据
INSERT INTO users VALUES
(1, 'user1@example.com'),
(2, 'user2@example.org'),
(3, 'user3@example.net');-- 使用 REGEXP 筛选以 .com 结尾的邮箱
SELECT id, email
FROM users
WHERE email REGEXP '.+@.+\.com$';

在上述代码中,正则表达式 .+@.+\.com$ 表示:

  • .+:匹配一个或多个任意字符。
  • @:匹配字符 @
  • \.:匹配字符 .,由于 . 在正则表达式中有特殊含义,所以需要使用 \ 进行转义。
  • com:匹配字符 com
  • $:表示字符串的结尾。

运行上述查询后,将返回 email.com 结尾的用户记录。

三、常见应用场景

3.1 验证数据格式

在实际业务中,经常需要验证数据是否符合特定的格式,例如手机号码、身份证号码等。以下是验证手机号码格式的示例:

-- 创建示例表
CREATE TABLE contacts (contact_id INT,phone_number STRING
);-- 插入示例数据
INSERT INTO contacts VALUES
(1, '13800138000'),
(2, '2345678901'),
(3, '15600156000');-- 筛选出符合手机号码格式的记录
SELECT contact_id, phone_number
FROM contacts
WHERE phone_number REGEXP '^1[3-9]\\d{9}$';

正则表达式 ^1[3-9]\\d{9}$ 表示:

  • ^:表示字符串的开始。
  • 1:匹配字符 1
  • [3 - 9]:匹配 3 到 9 之间的任意一个数字。
  • \\d{9}:匹配 9 个数字,\\d[0 - 9] 的简写。
  • $:表示字符串的结尾。

3.2 提取特定信息

有时我们需要从复杂的字符串中提取特定的信息,例如从网页 URL 中提取域名。

-- 创建示例表
CREATE TABLE web_pages (page_id INT,url STRING
);-- 插入示例数据
INSERT INTO web_pages VALUES
(1, 'https://www.example.com/article/123'),
(2, 'http://blog.example.org/post/456'),
(3, 'https://news.example.net/story/789');-- 提取域名
SELECT page_id, url,REGEXP_EXTRACT(url, 'https?://([^/]+)', 1) AS domain
FROM web_pages;

在上述代码中,使用了 REGEXP_EXTRACT 函数,它用于从字符串中提取符合正则表达式模式的部分。正则表达式 https?://([^/]+) 表示:

  • https?://:匹配 http://https://
  • ([^/]+):这是一个捕获组,[^/] 表示匹配除 / 以外的任意字符,+ 表示匹配一个或多个。
  • 1:表示提取第一个捕获组中的内容,即域名部分。

3.3 数据清洗和转换

在数据清洗过程中,我们可能需要去除字符串中的特定字符或替换不符合要求的部分。以下是去除字符串中所有数字的示例:

-- 创建示例表
CREATE TABLE dirty_text (text_id INT,text_content STRING
);-- 插入示例数据
INSERT INTO dirty_text VALUES
(1, 'abc123def'),
(2, 'xyz456uvw'),
(3, 'pqr789stu');-- 去除字符串中的数字
SELECT text_id, REGEXP_REPLACE(text_content, '\\d', '') AS clean_text
FROM dirty_text;

在上述代码中,使用了 REGEXP_REPLACE 函数,它用于将字符串中符合正则表达式模式的部分替换为指定的字符串。正则表达式 \\d 表示匹配任意数字,将其替换为空字符串,从而去除字符串中的所有数字。

四、高级用法

4.1 多级条件匹配

在某些情况下,我们需要进行多级条件的匹配,即先匹配一个大的模式,再在匹配的结果中进一步匹配更具体的模式。以下是一个示例,假设我们要找出 email.com 结尾且用户名包含数字的用户记录:

SELECT id, email
FROM users
WHERE email REGEXP '.+@.+\.com$'AND email REGEXP '[0-9]+@';

上述查询先筛选出 email.com 结尾的记录,然后在这些记录中进一步筛选出用户名包含数字的记录。

4.2 结合其他函数使用

REGEXP 函数可以与其他 Hive SQL 函数结合使用,以实现更复杂的功能。例如,结合 CASE 语句根据字符串的匹配结果进行分类。

SELECT id, email,CASEWHEN email REGEXP '.+@.+\.com$' THEN 'Com Email'WHEN email REGEXP '.+@.+\.org$' THEN 'Org Email'ELSE 'Other Email'END AS email_type
FROM users;

上述代码根据 email 的后缀进行分类,使用 CASE 语句结合 REGEXP 函数判断 email 属于哪种类型。

五、总结

Hive SQL 中的 REGEXP 函数是一个强大的工具,它基于正则表达式提供了灵活的字符串匹配和处理能力。在实际的数据处理和分析工作中,合理运用 REGEXP 函数能高效地完成数据筛选、提取、清洗和转换等任务。同时,需要注意正则表达式的性能问题,复杂的正则表达式可能会影响查询的执行效率,因此在编写正则表达式时要尽量简洁和高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34836.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Spring Boot项目中接入DeepSeek深度求索,感觉笨笨的呢

文章目录 引言1. 什么是DeepSeek?2. 准备工作2.1 注册DeepSeek账号 3.实战演示3.1 application增加DS配置3.2 编写service3.3 编写controller3.4 编写前端界面chat.html3.5 测试 总结 引言 在当今快速发展的数据驱动时代,企业越来越重视数据的价值。为了…

【数据分析】读取文件

3. 读取指定列 针对只需要读取数据中的某一列或多列的情况,pd.read_csv()函数提供了一个参数:usecols,将包含对应的columns的列表传入该参数即可。 上面,我们学习了读取 "payment" 和 "items_count" 这…

Ubuntu 优化 Vim 指南

Vim 是一款功能强大的文本编辑器,通过合适的配置,可以变成一个接近 IDE 的高效开发工具。本指南提供 最精简、最实用 的 Vim 配置,满足 代码补全、语法高亮、代码格式化、目录管理等常用需求。 1. 必须安装的软件 首先,确保你的系…

信创环境下TOP5甘特图工具对比:从功能到适配性测评

在数字化转型的浪潮中,项目管理的高效与否直接决定了企业能否在激烈的市场竞争中脱颖而出。而甘特图作为项目管理中不可或缺的工具,其重要性不言而喻。尤其是在信创环境日益受到重视的当下,选择一款适配性强、功能完备的甘特图工具&#xff0…

MinIO的预签名直传机制

我们传统使用MinIo做OSS对象存储的应用方式往往都是在后端配置与MinIO的连接和文件上传下载的相关接口,然后我们在前端调用这些接口完成文件的上传下载机制,但是,当并发量过大,频繁访问会对后端的并发往往会对服务器造成极大的压力…

【NLP 38、实践 ⑩ NER 命名实体识别任务 Bert 实现】

去做具体的事,然后稳稳托举自己 —— 25.3.17 数据文件: 通过网盘分享的文件:Ner命名实体识别任务 链接: https://pan.baidu.com/s/1fUiin2um4PCS5i91V9dJFA?pwdyc6u 提取码: yc6u --来自百度网盘超级会员v3的分享 一、配置文件 config.py …

Windows下安装MongoDB 8

在Windows下安装MongoDB,首先需要确定自己的Windows系统版本以及MongoDB社区版所能支持的系统版本。这里使用的是Windows 10操作系统和MongoDB 8.0.4版本。由于MongoDB 6版本之后,不再默认安装Mongo Shell,所以本节分为两部分:安装…

【Node.js入门笔记4---fs 目录操作】

Node.js入门笔记4 Node.js---fs 目录操作一、目录操作1.fs.mkdir():创建目录。异步,非阻塞。创建单个目录创建多个目录创建目前之前需要确认是否存在: 2. fs.mkdirSync():用于创建一个新的目录。异步,非阻塞。3.fs.rmd…

DeepSeek-R1思路训练多模态大模型-Vision-R1开源及实现方法思路

刚开始琢磨使用DeepSeek-R1风格训练多模态R1模型,就看到这个工作,本文一起看看,供参考。 先提出问题,仅靠 RL 是否足以激励 MLLM 的推理能力? 结论:不能,因为如果 RL 能有效激励推理能力&#…

Python学习第十八天

Django模型 定义:模型是 Django 中用于定义数据库结构的 Python 类。每个模型类对应数据库中的一张表,类的属性对应表的字段。 作用:通过模型,Django 可以将 Python 代码与数据库表结构关联起来,开发者无需直接编写 S…

总结 HTTP 协议的基本格式, 相关知识以及抓包工具fiddler的使用

目录 1 HTTP是什么 2 HTTP协议格式 3 HTTP请求(Request) 3.1 认识URL 3.2 方法 3.3 认识请求"报头"(header) 3.3.1 Host 3.3.2 Content-Length 3.3.3 Content-Type 3.3.4 User-Agent (简称UA) 3.3.5 Referer 3.3.6 Cookie和Session 4 HTTP响应详解 4.…

【sql靶场】第15、16关-post提交盲注保姆级教程

目录 【sql靶场】第15、16关-post提交盲注保姆级教程 1.知识回顾 ‌GET请求‌ ‌POST请求‌ or与and 2.第十五关 1.布尔盲注的手动注入 1.判断 2.数据库名长度 3.数据库名字符 4.表名数 5.表名长度 6.表名符 7.字段数 8.字段长度 9.字段符 2.布尔盲注的脚本注入…

【C++】 —— 笔试刷题day_6

刷题day_6,继续加油哇! 今天这三道题全是高精度算法 一、大数加法 题目链接:大数加法 题目解析与解题思路 OK,这道题题目描述很简单,就是给我们两个字符串形式的数字,让我们计算这两个数字的和 看题目我…

redis终章

1. 缓存(cache) Redis最主要的用途,三个方面1.存储数据(内存数据库);2.缓存[redis最常用的场景];3.消息队列。 缓存(cache)是计算机中的⼀个经典的概念.核⼼思路就是把⼀些常⽤的数据放到触⼿可及(访问速度更快)的地⽅…

Matlab 多输入系统极点配置

1、内容简介 略 Matlab 172-多输入系统极点配置 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 clc close all clear A [-6.5727 1.1902 0 -53.4085;1.1902 -6.5727 0 -53.4085;0.5294 0.5294 0 17.7502;0 0 1 0]; B [1.3797 -0.2498;-0.2498 1.3797;-0.1111 -0.1…

国产编辑器EverEdit - 脚本(解锁文本编辑的无限可能)

1 脚本 1.1 应用场景 脚本是一种功能扩展代码,用于提供一些编辑器通用功能提供不了的功能,帮助用户在特定工作场景下提高工作效率,几乎所有主流的编辑器、IDE都支持脚本。   EverEdit的脚本支持js(语法与javascript类似)、VBScript两种编程…

Flutter 小技巧之通过 MediaQuery 优化 App 性能

许久没更新小技巧系列,温故知新,在两年半前的《 MediaQuery 和 build 优化你不知道的秘密》 我们聊过了在 Flutter 内 MediaQuery 对应 rebuild 机制,由于 MediaQuery 在 MaterialApp 内,并且还是一个 InheritedWidget &#xff0…

AI-医学影像分割方法与流程

AI医学影像分割方法与流程–基于低场磁共振影像的病灶识别 – 作者:coder_fang AI框架:PaddleSeg 数据准备,使用MedicalLabelMe进行dcm文件标注,产生同名.json文件。 编写程序生成训练集图片,包括掩码图。 代码如下: def doC…

【蓝桥杯每日一题】3.16

🏝️专栏: 【蓝桥杯备篇】 🌅主页: f狐o狸x 目录 3.9 高精度算法 一、高精度加法 题目链接: 题目描述: 解题思路: 解题代码: 二、高精度减法 题目链接: 题目描述&…

人工智能组第一次培训——deepseek本地部署和知识库的建立

deepseek本地部署的用处 减少对网络依赖性: 在断网环境下,依然可以使用预先下载的AI模型进行处理,避免因网络不稳定而无法完成任务。 提高响应速度: 数据和模型已经在本地设备上准备好,可以直接调用,不…