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就好了

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

测试并整理的 Airpods Pro 刻字可用的最全特殊符号

天气符号 ☉ 文化符号 卍卐 办公室符号 № ℗ ℡ ℀ ℅ ™ © ‰ 技术符号 ⇧  打勾符号 ˇ ∨ √ 人的符号 ♀ ♂ ヅ ツ 星星符号 ☆ ★ ✽ 箭头符号 ↖ ↗ ↘ ↙ ↸ ↹ ⇦ ⇧ ⇨ ⇩ ↓ ← → ↑ 图形符号 ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋▋▌▍▎ ▏▓ ▔ ■ □ …

msvcp110.dll丢失怎么修复(一键修复办法)

msvcp110.dll是C编程中非常重要的库文件之一。它实现了运行时库的大部分功能,并提供了许多标准库和其他功能的具体实现,如多线程编程和IO操作等。提高程序的运行效率和稳定性。下面是详细解决msvcp110.dll丢失问题的方法跟msvcp110.dll文件的介绍。 msvc…

python数据分析学习笔记之matplotlib、numpy、pandas

为了学习机器学习,在此先学习以下数据分析的matplotlib,numpy,pandas,主要是为自己的学习做个记录,如有不会的可以随时查阅。希望大家可以一起学习共同进步,我们最终都可以说:功不唐捐&#xff…

SpringBoot自定义starter之接口日志输出

文章目录 前言文章主体1 项目全部源码2 项目结构介绍3 starter 的使用3.1 配置文件 application,yml的内容3.2 启动类3.3 控制器类 4 测试结果 结语 前言 本文灵感来源是一道面试题。 要求做一个可以复用的接口日志输出工具,在使用时引入依赖,即可使用。…

allure报告中如何让测试步骤更清晰

一、allure step测试用例步骤说明 allure step编写测试用例有两种方式 1、with allure.step()用在测试用例中 公共方法代码: # common_fucntion.py import allure import pytest from common.tools.log_util import LoggerrunlogLogger().get_log流程性的用例&a…

ABIDE Preprocessed 结构态MRI数据集介绍及下载

ABIDE数据集介绍及下载 ABIDE Prerocessed项目是在ABIDE I 项目的基础上发展而来,主要是对ABIDE I中采集到的原始数据进行了一定的预处理和初步的特征提取。针对于fMRI和sMRI数据有着不同的处理方式,本次主要对其中提供的sMRI预处理结果进行介绍&#xf…

聊聊TCP协议的粘包、拆包以及http是如何解决的?

目录 一、粘包与拆包是什么? 二、粘包与拆包为什么发生? 三、遇到粘包、拆包怎么办? 解决方案1:固定数据大小 解决方案2:自定义请求协议 解决方案3:特殊字符结尾 四、HTTP如何解决粘包问题的&#xf…

2013年终总结

年终感悟: 2013年就这样过去了,每个人都一样,使用了自己一年生命药水,要知道这种药品是花多少钱都买不来的。现在回头看看,我用这一瓶药水都做了那些事情。在这一年里,有过欢笑,有过悲伤。到了年…

控制算法工程师的工作职责(合集)

控制算法工程师的工作职责1 职责: 1、准确地控制密闭容器的气体或液体的压力,以供校准其他压力表使用; 2、准确地控制温度场的精度,以供校准其他温度计使用; 3、根据不同的控制方案和执行机构/加热制冷方式;测试其特性、建立数学模型、设计算…

SpringCloudAlibaba 微服务生态

一 微服务架构 1.1 微服务 微服务其实是一种架构风格,我们在开发一个应用的时候这个应用应该是由一组小型服务组成,每个小型服务都运行在自己的进程内;小服务之间通过HTTP的方式进行互联互通。 1.2 微服务架构的常见问题 一旦采用微服务系…

【正点原子STM32连载】 第二十六章 USMART调试组件实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第二十…

Prosys OPC UA Modbus Server,一个modbus转opcua的服务器软件

Prosys OPC UA Modbus Server是prosys公司发布的一个modbus转opcua服务的软件。 他们的OPC UA 模拟器软件你肯定听说过,软件是免费的。 这个软件是面向企业收费的,需要License,试用版只能运行2小时,不过作为测试使用也足够了。 作用&#…

避坑之网上下单的手机流量卡为什么老是失败!

最近有一些小伙伴们反应:在网上下单的手机流量卡,经常提示下单失败,不是这问题就是那问题的。 对于小伙伴们的诉求,小编向来是来者不拒的。今天就为大家整理一下下单失败的四大原因。 失败原因一:下单信息填写错误 下…

Swift 周报 第三十期

文章目录 前言新闻和社区App、App 内购买项目和订阅即将实行税率调整码出新宇宙Apple 公证服务更新Apple 设计大奖入围名单公布 提案通过的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组自主整理周报的第二十一期,每个模块已初步成型。各位读者…

Flutter的菜鸟教程一:第一个Flutter应用

2019/1/3留(别再问了昂,之前忘了发出来): Flutter SDK 官网 Dart 官网 Flutter是什么? 跨平台(Android/ios)构建移动应用程序的简单高效方式 Flutter核心只有一层轻量的C/C代码,而上层使用了Dart语言(一种现代的、简洁的、面向对象的语言-ps:我没学直…

Flex 布局语法教程

flex-wrap属性 布局的传统解决方案,基于盒状模型,依赖 display属性 position属性 float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 ps:面试的时候也经常会问到一些 一、Flex布局是什么? F…

tomcat的部署

文章目录 一、什么是tomcat二、Tomcat 功能组件结构三、Tomcat 请求过程四、Tomcat的服务部署五、配置虚拟主机六、Tomcat多实例部署 一、什么是tomcat Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件…

SpringBootWeb案例-1(下: 来源黑马程序员)

3. 员工管理 完成了部门管理的功能开发之后,我们进入到下一环节员工管理功能的开发。 基于以上原型,我们可以把员工管理功能分为: 分页查询带条件的分页查询删除员工新增员工修改员工 3.1 分页查询 3.1.1 基础分页 3.1.1.1 需求分析 我…

Java开发手册中为什么要求三目运算符必须要注意类型对齐

场景 java开发手册中对于三目运算符的使用要求如下: 【强制】三目运算符 condition? 表达式 1 : 表达式 2 中,高度注意表达式 1 和 2 在类型对齐时, 可能抛出因自动拆箱导致的 NPE 异常。 说明:以下两种场景会触发类型对齐的拆箱操作&am…

【统计分析】Bland-Altman图:MedCalc操作指南与Python实现

之前有记录过一致性分析中的天选之子ICC(传送),也提到过Bland-Altman图,Bland-Altman图在一致性分析中作为一种既定量又定性的方法,还有着高颜值的表达展现,受到了广泛地应用。   如下图所示,…