hive中如何计算字符串中表达式

比如

select ' 1+(2-3)+(-4.1-3.1)-(4-3)-(-3.3+4.3)-1 ' col ,1+(2-3)+(-4.1-3.1)-(4-3)-(-3.3+4.3)-1 result

 \

现在的需求式 给你一个字符串如上述col 你要算出result。

前提式 只有+和-的运算,而且只有嵌套一次 -(4-3)没有 -(-4+(3-(3+1)))嵌套多次。

第一步我们需要将运算拆分为每一个单独的计算例如上述拆分为

1

+(2-3)

+(4.1-3.1)

-(4-3)

-(-3.3+4.3)

-1

这几部分,然后记住前面的符号,

第二部再将这几部分中的计算再拆分。

例如 +(2-3) 拆分为2 +  -3

-(4-3) 差分为 4-3结果为 4 +  -3 因为括号前面是负号 改为 negtive(4) +negtive(-3)。

总体思路就是将每一个单独的数字得出其正负,然后所有数字相加。

涉及到的语法有 lateral view 一行变多行

split 如何拆分整个算式。

substring/translate去除掉括号

其中最难点在于split。

第一步如何split? 我们将一个表达式拆分

'1+(2-3)+(-4.1-3.1)+13-(4-3)-(-3.3+4.3)-11' 如何拆分为下面的数组

["1","+(2-3)","+(-4.1-3.1)","+13","-(4-3)","-(-3.3+4.3),-11"]

 我们首先根据什么split? + - 还是+(  ,)-

说实话这个玩意是真的难写。

select split( '1+(2-3)+(-4.1-3.1)-(4-3)-(-3.3+4.3)','(?=([\\-\\+]\\())')

结果 ["1","+(2-3)","+(-4.1-3.1)","-(4-3)","-(-3.3+4.3)"]

看着好像是全部拆分了,以为没问题的时候,又发现了问题

select split( '1+(2-3)+(-4.1-3.1)+3-(4-3)-(-3.3+4.3)','(?=([\\-\\+]\\())')

结果 ["1","+(2-3)","+(-4.1-3.1)+3","-(4-3)","-(-3.3+4.3)"]

这里这个+3没有单独的分组

经过改进

select split( '1+(2-3)+(-4.1-3.1)+3-(4-3)-(-3.3+4.3)','(?=([\\-\\+]\\())|(?=[\\-\\+]\\d+[\\-\\+])') 

["1","+(2-3)","+(-4.1-3.1)","+3","-(4-3)","-(-3.3+4.3)"]

然后又发现了问题

select split( '1+(2-3)+(-4.1-3.1)+3-(4-3)-(-3.3+4.3)+11','(?=([\\-\\+]\\())|(?=[\\-\\+]\\d+[\\-\\+])') 

["1","+(2-3)","+(-4.1-3.1)","+3","-(4-3)","-(-3.3+4.3)+11"] 

--说实话这个b正则式真难写

最后为

 select split( '1+(2-3)+(-4.1-3.1)+3-(4-3)-(-3.3+4.3)-11','(?=([\\-\\+]\\())|(?=[\\-\\+]\\d+($|[\\+\\-]))')

["1","+(2-3)","+(-4.1-3.1)","+3","-(4-3)","-(-3.3+4.3)","-11"]

 接着是要拆分括号里的计算

select split( a ,'(?=[+-]\\d)')
from (
         select '1+2+3' a  union all select '1-2+3' union all select '-1-1-3'
         )t

 

 select sum(`if`(is_positive,replace(tmp.res,'+',''),negative(tmp.res)))
from (
                  select t.a,
                         substr(t.a, instr(t.a, '(') + 1, `if`(t.a not like '%(%',
                                                               length(t.a),
                                                               instr(t.a, ')') - instr(t.a, '(') - 1
                             )) res,
                         instr(t.a, ')'),
                         instr(t.a, '('),
                         is_positive
                  from (
                           select t.a a, `if`(substr(a, 1, 1) = '-' and  locate('(',a)>0, false, true) is_positive
                           from (select explode(split('1+(2-3)+(-4.1-3.1)+13-(4-3)-(-3.3+4.3)-11',
                                                      '(?=([\\-\\+]\\())|(?=[\\-\\+]\\d+($|[\\+\\-]))')) a) t
                       ) t
              )t lateral view  explode(split(t.res,'(?=[+-]\\d)'))tmp as res

 select 1+(2-3)+(-4.1-3.1)+13-(4-3)-(-3.3+4.3)-11

 

结果有点误差因为是string是看作float去计算的 所以有误差,cast as decimal就好了

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【学习笔记】Python核心技术与实战-基础篇-03列表和元组,到底用哪个?

目录 列表和元组基础概念区别列表和元组的基础操作和注意事项列表和元组存储方式的差异列表和元组的性能列表和元组的使用场景总结思考题 列表和元组基础 概念 列表和元组,都是一个可以放置任意数据类型的有序集合。 在绝大多数编程语言中,集合的数据类…

js数据类型和六种运算结果为false的情况

数据类型 number:数字(整数、小数、NaN(Not a Number)) string:字符串、单双引皆可 boolean:布尔。true、false null:对象为空 undefined:当声明的变量初始化时,该变量的默认值…

JPEG压缩基本原理

JPEG算法的第一步是将图像分割成8X8的小块。 在计算机中,彩色图像最常见的表示方法是RGB格式,通过R(Red)、G(Green)A和(Blue)组合出各种颜色。 除此以外,还有一种表示彩色图像的方法,称为YUV格式。Y表示亮度,U和V表示…

Spring第三方bean管理

文章目录 1.第三方bean管理1.1 Bean1.2 小结 2.第三方bean依赖注入2.1 简单类型:成员变量2.2 引用类型:方法形参2.3 小结 3.总结 1.第三方bean管理 1.1 Bean 首先看一下目录结构,APP里面就初始化了SpringConfig文件 SpringConifg中就一句话…

C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解

目录 1、引言 2、什么是智能指针? 3、在Visual Studio中查看智能指针的源码实现 4、独占式指针unique_ptr 4.1、查看unique_ptr的源码实现片段 4.2、为什么unique_ptr的拷贝构造函数和复制函数被delete了?(面试题) 4.3、使…

Java网络开发(Tomcat)—— Servlet学习 Web相关背景知识 JavaWeb项目初步

本文目录 引出〇、域名、IP、端口一、软件架构BS和CS二、实现Web服务的条件和步骤三、Tomcat搭建Web项目初步1.pom.xml文件配置2.web.xml文件更新3.Tomcat运行环境配置4.项目文件层级解析 四、JavaWeb项目文件分类(1)静态文件—存放位置(2&am…

今天面了个字节跳动拿30k出来的测试大佬,让我见识到了什么是天花板

2022年堪称大学生就业最难的一年,应届毕业生人数是1076万。失业率超50%! 但是我观察到一个数据,那就是已经就业的毕业生中,计算机通信等行业最受毕业生欢迎! 计算机IT行业薪资高,平均薪资是文科其他岗位的…

【Linux】常用命令的汇总学习

文章目录 1.目录切换命令2.目录操作命令3.把ls -l中包含字母file(不区分大小写)的内容输出4.统计txt中的某个字符串5.grep命令的使用6.linux查找当前目录下所有txt文件7.linux中的find命令8.查看系统所有的进程信息9.如何确定文件的类型10.tar解压缩11.U…

Java数据驱动:CData JDBC Drivers 2022 Crack

JDBC 驱动程序 易于使用的 JDBC 驱动程序,具有强大的企业级功能 无与伦比的性能和可扩展性。 对实时数据的简单 JDBC/SQL 访问。 从流行的 BI 工具访问实时数据。 集成到流行的 IDE 中。 CData JDBC Drivers Software 是领先的数据访问和连接解决方​​案提供商。我…

如何更改 Linux 文件和目录权限?

在Linux系统中,文件和目录权限是安全性和访问控制的关键组成部分。正确设置文件和目录的权限可以确保只有授权的用户能够读取、写入或执行这些文件和目录。 本文将详细介绍如何在Linux系统中更改文件和目录的权限。 1. 文件和目录权限概述 在Linux系统中&#xff…

【sentinel】漏桶算法在Sentinel中的应用

漏桶算法介绍 漏桶算法,又称leaky bucket。 从图中我们可以看到,整个算法其实十分简单。首先,我们有一个固定容量的桶,有水流进来,也有水流出去。对于流进来的水来说,我们无法预计一共有多少水会流进来&am…

AUTOSAR通信篇 - CAN网络通信(二:CanIf)

目录 初始化 数据发送 请求发送 发送数据流 发送缓存 发送确认 数据接收 数据接收提醒 读取接收数据 CAN控制器模式 控制器模式转换 唤醒 PDU通道模式控制 PDU通道组 PDU通道模式 总结 在上一篇,我们介绍了CAN模块,接下来我们介绍在CAN模…

基于html+css的图展示96

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

ts报错“this“ 隐式具有类型 “any“,因为它没有类型注释。解决方案

序 1、参考博文》①严格模式 - 知乎,②ts的tsconfig.son中文说明③TypeScript Number | 菜鸟教程 2、解决(ts报错“this“ 隐式具有类型 “any“,因为它没有类型注释。) 3、解决(函数内this是undefined 的问题&#xf…

STM32CubeIDE + HAL + STM32f103C8T6 系列教程1 ---板载PC13LED闪烁

STM32CubeIDE HAL STM32f103C8T6 系列教程1 --- 板载PC13LED闪烁 引言硬件关于开发板[^2]控制器内置存储器原理图 硬件连线硬件连接表硬件连线图 软件STM32CubeIDE下载及安装Stm32CubeIDE设置补全快捷键和主题新建一个工程选择开发板核心芯片型号设置工程相关参数STM32CubeMX…

《程序员面试金典(第6版)》面试题 02.08. 环路检测(哈希法,双指针,检测链表是否有环)

题目描述 给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点。若环不存在,请返回 null。 题目传送门:面试题 02.08. 环路检测 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链…

【笔记整理】常见聚类算法

【笔记整理】常见聚类算法 文章目录 【笔记整理】常见聚类算法一、均值偏移 - Mean-shift(★★★★)1、概述 & 图解(“偏心”)2、公式 & 步骤1)基本公式(“偏移量更新圆心”)2&#xff…

4:File类与IO流

文章目录 File类1:引入:2:对文件进行操作3:对目录/文件夹进行操作 IO流1:引入:2:字符输入 / 出流FileReader 与 FileWriter3:用try - catch - finally 处理异常4:几个常见…

【Android-JetpackCompose】13、实战在线课程 App

文章目录 一、BottomNavigation 底部导航1.1 底部导航栏的布局、点击1.2 设置 bottomBar 的颜色1.3 设置顶部 actionBar 的颜色 二、主页 StudyScreen2.1 顶部状态栏2.2 一、BottomNavigation 底部导航 1.1 底部导航栏的布局、点击 首先,构造 NavigationItem 的 d…

c++—断言、异常

一、 断言,主要用于在函数入口处进行参数检查,是否符合参数设置要求; (1)true:继续执行;false:终止运行; (2)特点:在程序运行时才能起…