当前位置: 首页 > 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;随着…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...