当前位置: 首页 > news >正文

大数据之Hive:regexp_extract函数案例

目录

  • 一、正则的通配符简介
    • 1、正则表达式的符号及意义
    • 2、各种操作符的运算优先级:
  • 二、案例
    • 数据
    • 要求
    • 分析
    • 实现
    • 输出结果
    • 实现2
    • 实现3
  • 总结

一、正则的通配符简介

1、正则表达式的符号及意义

符号含义实列
/做为转意,即通常在"/"后面的字符不按原来意义解释如" * “匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了”/"后,/a/* /将只匹配"a* "
.匹配任何一个字符
^匹配一个输入或一行的开头/^a/匹配"an A",而不匹配"An a"
$匹配一个输入或一行的结尾/a$/匹配"An a",而不匹配"an A"
*匹配前面元字符0次或多次/ba*/将匹配b,ba,baa,baaa
+匹配前面元字符1次或多次/ba+/将匹配ba,baa,baaa
?匹配前面元字符0次或1次/ba?/将匹配b,ba
(x)匹配x保存x在名为$1…$9的变量中
x竖y匹配x或y
{n}精确匹配n次
{n,}匹配n次以上
{n,m}匹配n-m次
[xyz]字符集(character set),匹配这个集合中的任一一个字符(或元字符)
[^xyz]不匹配这个集合中的任何一个字符
/d匹配一个字数字符//d/ = /[0-9]/
/D匹配一个非字数字符//D/ = /[^0-9]/
/s匹配一个空白字符,包括/n,/r,/f,/t,/v等
/S匹配一个非空白字符,等于/[^/n/f/r/t/v]/
/w匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[/w]匹配"$5.98"中的5,等于[a-zA-Z0-9]
/W匹配一个不可以组成单词的字符,如[/W]匹配"$5.98"中的 $,等于[^a-zA-Z0-9]

备注:
‘( )’ 标记一个子表达式的开始和结束位置。
‘[]’ 标记一个中括号表达式。
/num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。

2、各种操作符的运算优先级:

转义符>圆括号和方括号>限定符>位置和顺序
具体如下:
/ 转义符
(), ( ?: ), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, anymetacharacter 位置和顺序
正则表达式的符号及意义

二、案例

数据

with temp as 
(select '[{favorite=["电影":杀死比尔,"电视剧":宰相刘罗锅],age=15,gender:男}]' as attributes ---第一行
union all 
select '[{favorite="像风一样的女人",age=未知,gender:男}]' as attributes ---第二行
union all 
select '[{favorite=28, gender:女,age=15}]' as attributes ---第三行
union all 
select '[{gender:女,favorite=["综艺","动漫"],age=15 }]' as  attributes ---第四行
)

要求

将favorite的值,age的值和gender的值取出来

分析

  1. 目前从temp表可知表中可知表里面只有一个attributes(特征)字段,这个字段其实包含三个字段,分别为favorite和age和gender
  2. 该字段类型不是标准的json格式,哪怕转换成标准的json格式也不太容易,假设转成json,你首先要处理最外层的中括号,其次json里面的key是有双引号的,你需要给key添加双引号,再次字段类型也不一致,age=15和age=未知;
  3. 综上分析需要使用regexp_extract函数
  4. 使用regexp_extract函数需要注意什么?注意字段顺序不一样,不是统一的,这是第一点;第二点有些逗号后面有空格,有些没有,花括号前有些有空格,有些没有;第三点favorite和age后面是等号,gender后面是冒号;

实现

select 
regexp_extract (attributes,'favorite\\=(.*?)(\\,\\s{0,1}age|\\,\\s{0,1}gender|\\s{0,1}\\})',1) as favorite
,regexp_extract (attributes,'age\\=(.*?)(\\s{0,1}\\}|\\,\\s{0,1}favorite|\\,\\s{0,1}gender)',1) as age
,regexp_extract (attributes,'gender\\:(.*?)(\\s{0,1}\\}|\\,\\s{0,1}favorite|\\,\\s{0,1}age)',1) as gender
from  temp
;

输出结果

favoriteagegender
[“电影”:杀死比尔,“电视剧”:宰相刘罗锅]15
“像风一样的女人”未知
2815
[“综艺”,“动漫”]15

实现2

虽然说转json比较麻烦,但还是可以实现的,需要一些技巧;主要的问题是加引号,其次是去最外层的中括号,其他是一些小细节;

----去除空格字符和里面的引号(会在加引号时有干扰)等,第一个replace去空格,第二个去除双引号
select  regexp_replace( regexp_replace(attributes,'\\n|\\r|\\t|\\s',''),'\\"','')
from temp
----处理最外层的中括号,并加最外层的引号
select  regexp_replace(regexp_replace(regexp_replace( regexp_replace(attributes,'\\n|\\r|\\t|\\s',''),'\\"',''),'\\[\\{','\\{\\"'),'\\}\\]','\\"\\}')
from temp
----最终处理
select  regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace( regexp_replace(attributes,'\\n|\\r|\\t|\\s',''),'\\"',''),'\\[\\{','\\{\\"'),'\\}\\]','\\"\\}'),'gender\\:','gender\\='),'\\=','\\"\\:\\"'),'\\,','\\&'),'\\&age','\\"\\,\\"age'),'\\&gender','\\"\\,\\"gender'),'\\&favorite','\\"\\,\\"favorite') as attributes
from temp 

至此终于到最标准的json格式了,处理json可以使用get_json_object,也可以使用json_tuple

select 
get_json_object(attributes,'$.favorite')
,get_json_object(attributes,'$.age')
,get_json_object(attributes,'$.gender')
from  
(select  regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace( regexp_replace(attributes,'\\n|\\r|\\t|\\s',''),'\\"',''),'\\[\\{','\\{\\"'),'\\}\\]','\\"\\}'),'gender\\:','gender\\='),'\\=','\\"\\:\\"'),'\\,','\\&'),'\\&age','\\"\\,\\"age'),'\\&gender','\\"\\,\\"gender'),'\\&favorite','\\"\\,\\"favorite') as attributes
from temp 
) tt 
select 
json_tuple(attributes,'favorite','age','gender') 
from  
(select  regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace( regexp_replace(attributes,'\\n|\\r|\\t|\\s',''),'\\"',''),'\\[\\{','\\{\\"'),'\\}\\]','\\"\\}'),'gender\\:','gender\\='),'\\=','\\"\\:\\"'),'\\,','\\&'),'\\&age','\\"\\,\\"age'),'\\&gender','\\"\\,\\"gender'),'\\&favorite','\\"\\,\\"favorite') as attributes
from temp 
) tt select 
b.favorite
,b.age
,b.gender
from (
select  regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace( regexp_replace(attributes,'\\n|\\r|\\t|\\s',''),'\\"',''),'\\[\\{','\\{\\"'),'\\}\\]','\\"\\}'),'gender\\:','gender\\='),'\\=','\\"\\:\\"'),'\\,','\\&'),'\\&age','\\"\\,\\"age'),'\\&gender','\\"\\,\\"gender'),'\\&favorite','\\"\\,\\"favorite') as attributes
from temp
) tt lateral view
json_tuple(attributes,'favorite','age','gender') b as favorite,age,gender

实现3

select 
attributes['favorite'] as favorite
,attributes['gender'] as gender
,attributes['age'] as age
from (
select 
str_to_map(attributes,',','=') as attributes
from  
(
select  
regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace( regexp_replace(attributes,'\\n|\\r|\\t|\\s',''),'\\"',''),'\\:','\\='),'\\,','\\&'),'\\&age','\\,age'),'\\&favorite','\\,favorite'),'\\&gender','\\,gender'),'(\\[\\{)|(\\}\\])','') as attributes
from  temp
) tt 
) ttm

总结

首先需要明确的是,上面中的例子是人为制造的,非常不规则,所以导致处理起来非常麻烦,里面有好几个中括号,中括号里面是逗号分割,还有gender专门后面编成冒号,这些无疑加大了处理难度;上述使用三种方法进行处理,优先级:regexp_extract >str_to_map>get_json_object;

相关文章:

大数据之Hive:regexp_extract函数案例

目录 一、正则的通配符简介1、正则表达式的符号及意义2、各种操作符的运算优先级: 二、案例数据要求分析实现输出结果实现2实现3 总结 一、正则的通配符简介 1、正则表达式的符号及意义 符号含义实列/做为转意,即通常在"/"后面的字符不按原来…...

tsconfig.json无法写入文件“XXXX“因为它会覆盖输入文件

在开发ts项目的时候,包错提示无法写入文件: tsconfig.json无法写入文件"XXXX"因为它会覆盖输入文件 这是tsconfig.json文件配置问题,需要加入下面的配置就好了: {"compilerOptions": {"outDir": …...

本周Github有趣项目:draw-a-ui等

有趣的项目、工具和库 gpt-crawler 抓取网站以生成知识文件,从而从 URL 创建您自己的自定义 GPT。 需要步骤: 配置运行爬虫、 将您的数据上传到 OpenAI:使用此选项通过 UI 访问您生成的知识,您可以轻松与他人共享 创建自定义助…...

VBA如何快速识别Excel单元格中的文本数字

Excel中一种非常特殊的数字,这些数字看似数字,其实是文本格式(下文简称为文本数字),在单元格的左上角会有一个绿色小三角作为标志,如B1:B3单元格。 在编程时为什么需要区分普通数字和文本数字呢&#xff…...

Mysql数据库 16.SQL语言 数据库事务

一、数据库事务 数据库事务介绍——要么全部成功要么全部失败 我们把完成特定的业务的多个数据库DML操作步骤称之为一个事务 事务——就是完成同一个业务的多个DML操作 例: 数据库事务四大特性 原子性(A):一个事务中的多个D…...

docker 部署Redis集群(三主三从,以及扩容、缩容)

1:创建6个redis容器 docker run -d --name redis01 --net host --privilegedtrue -v /opt/redis/redis01:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381 docker run -d --name redis02 --net host --privilegedtrue -v /opt/redis/redis0…...

JavaScript 浮点数运算的精度问题及解决

JavaScript 浮点数运算的精度问题及解决 在 JavaScript 中整数和浮点数都属于 Number 数据类型,当浮点数做数学运算的时候,你经常会发现一些问题,举几个例子: 0.1 0.2 0.30000000000000004 console.log(0.1 0.2) 0.3000000…...

基于STM32的无线传感器网络(WSN)通信方案设计与实现

无线传感器网络(Wireless Sensor Network,简称WSN)是由一组分布式的无线传感器节点组成的网络,用于监测和收集环境中的各类物理信息。本文将基于STM32微控制器,设计并实现一个简单的无线传感器网络通信方案&#xff0c…...

Flink和Kafka连接时的精确一次保证

Flink写入Kafka两阶段提交 端到端的 exactly-once(精准一次) kafka -> Flink -> kafka 1)输入端 输入数据源端的 Kafka 可以对数据进行持久化保存,并可以重置偏移量(offset) 2)Flink内…...

UE4动作游戏实例RPG Action解析三:实现效果,三连击Combo,射线检测,显示血条,火球术

一、三连Combo 实现武器三连击,要求: 1.下一段Combo可以随机选择, 2.在一定的时机才能再次检测输入 3. 等当前片段播放完才播放下一片段 1.1、蒙太奇设置 通过右键-新建蒙太奇片段,在蒙太奇里创建三个片段,并且移除相关连接,这样默认只会播放第一个片段 不同片段播…...

Linux/麒麟系统上部署Vue+SpringBoot前后端分离项目

目录 1. 前端准备工作 1.1 在项目根目录创建两份环境配置文件 1.2 环境配置 2. 后端准备工作 2.1 在项目resources目录创建两份环境配置文件 2.2 环境配置 3. 前后端打包 3.1 前端打包 3.2 后端打包 4、服务器前后端配置及部署 4.1 下载、安装、启动Nginx 4.2 前端项目部署…...

STM32在FreeRTOS下的us延时

STM32在FreeRTOS下的us延时 前言 freeRTOS下跑SPI时需要微秒级别的延时,但是freeRTOS只提供了毫秒级的,记录一下实现us延时的方法。 前期分析 最简单的方式就是开个定时器或者干脆直接计算一下用nop做都可以实现us延时,但是显然还是使用滴…...

软件测试/人工智能丨深入人工智能软件测试:PyTorch引领新时代

在人工智能的浪潮中,软件测试的角色变得愈发关键。本文将介绍在人工智能软件测试中的一些关键技术,以及如何借助PyTorch深度学习框架来推动测试的创新与升级。 PyTorch:深度学习的引擎 PyTorch作为一种开源的深度学习框架,为软件…...

Android 当中的 Fragment 协作解耦方式

Android 当中的 Fragment 协作解耦方式 文章目录 Android 当中的 Fragment 协作解耦方式第一章 前言介绍第01节 遇到的问题第02节 绘图说明 第二章 核心代码第01节 代理人接口第02节 中间人 Activity第03节 开发者A第04节 开发者B第05节 测试类 第一章 前言介绍 第01节 遇到的…...

城市网吧视频智能监控方案,实现视频远程集中监控

网吧环境较为复杂,电脑设备众多且人员流动性大,极易发生人员或消防事故,亟需改变,TSINGSEE青犀AI智能网吧视频监管方案可以帮助实现对网吧环境和用户活动的实时监控和管理。 1、视频监控系统 在网吧内部布置高清摄像头&#xff0…...

C#WPF视频播放器实例

本文实例演示C#WPF视频播放器 实例如下: 修改mainwindow的代码 <Windowx:Class="PlayerDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xml…...

【uniapp】Google Maps

话不多说 直接上干货 提前申请谷歌地图账号一、新建地图 使用h5获取当前定位或者使用三方uniapp插件 var coords ""navigator.geolocation.getCurrentPosition(function(position) {coords {lat: position.coords.latitude,lng: position.coords.longitude};lats …...

C语言变量与常量

跟着肯哥&#xff08;不是我&#xff09;学C语言的变量和常量、跨文件访问、栈空间 栈空间还不清楚&#xff0c;期待明天的课程内容 C变量 变量&#xff08;Variable&#xff09;是用于存储和表示数据值的名称。 主要包括四个环节&#xff1a;定义、初始化、声明、使用 在我刚…...

AI创作系统ChatGPT网站源码/支持DALL-E3文生图/支持最新GPT-4-Turbo模型+Prompt应用

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…...

二维码智慧门牌管理系统升级,异常门牌聚合解决方案助力高效管理

文章目录 前言一、异常门牌聚合解决方案 前言 在今天的数字化时代&#xff0c;智慧城市已成为发展趋势&#xff0c;其中二维码智慧门牌管理系统扮演着至关重要的角色。通过对门牌信息进行数字化管理&#xff0c;该系统极大提升了城市管理的效率和便捷性。然而&#xff0c;随着…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...

Windows 下端口占用排查与释放全攻略

Windows 下端口占用排查与释放全攻略​ 在开发和运维过程中&#xff0c;经常会遇到端口被占用的问题&#xff08;如 8080、3306 等常用端口&#xff09;。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口&#xff0c;帮助你高效解决此类问题。​ 一、准…...