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就好了
hive中如何计算字符串中表达式相关推荐
- 如何计算字符串中出现的字符串?
如何计算特定字符串在另一个字符串中出现的次数. 例如,这就是我要使用Javascript进行的操作: var temp = "This is a string."; alert(t ...
- java 判断 中文字符_java中判断字符串中是否有中文字符
package com.meritit.test; public class TestChart { public static void main(String[] args) throws Exc ...
- 如何在PHP中删除字符串中的所有空格? [重复]
本文翻译自:How do I strip all spaces out of a string in PHP? [duplicate] Possible Duplicate: 可能重复: To str ...
- python删除字符串中的字母_在Python中删除字符串中的大写字母
我想写一个函数消除一个字符串和2个可选参数.第一个可选参数(bad_characters)取一个字母,第三个参数(case_sensitive)取一个布尔值.该函数应该接受一个字符串s并移除bad_c ...
- java 匹配最后一次出现的字符_在Java中查找字符串中字符的最后一次出现
使用该lastIndexOf()方法在Java中查找字符串中字符的最后一次出现. 假设以下是我们的字符串.String myStr = "Amit Diwan"; 在上面的字符串中 ...
- 从Google表格中的字符串中提取多个特定长度的数字子串的解决思路
问题描述: 我只需要从Google 表格中的字符串中拆分或提取由 8 位数字组成的数字. 我尝试过SPLITorREGEXREPLACE但我找不到只获取该长度的数字的方法,我只获取字符串中的所有数字! ...
- java字符串确定汉字_java中判断字符串中汉字的个数
使用方法3与方法4时需要注意一些问题,代码中会有注释. 代码如下: package 包名; import java.util.ArrayList; import java.util.regex.Mat ...
- python中判断字符串中出现次数最多的字母
python中判断字符串中出现次数最多的字母 import string def check(text):text = text.lower()return max(string.ascii_lowe ...
- python字符串去掉空行_从python中的字符串中删除空格
python字符串去掉空行 如何在python中删除字符串中的空格 (How to remove whitespaces in a string in python) str.lstrip()str. ...
最新文章
- Android使用ViewPager实现左右循环滑动及轮播效果
- 互联网 DBA 需要做那些事(转)
- 7-1 活动选择问题 (25 分)(思路+详解+扩展)宝 今天你AC了吗!!!
- python学习中遇到的问题
- 17商品推荐系统项目框架
- redis专题:redis的主从、哨兵、集群架构的配置和部署详情、以及问题分析
- 微机原理换行代码_微机原理
- 定时器(setTimeout/setInterval)调用带参函数失效解决方法
- IOS学习之路十(仿人人滑动菜单Slide-out Sidebar Menu)
- php在线售卡系统,云尚在线发卡系统PHP源码|专门为个人或小型企业提供在线售卡,订单处理系统...
- 【VLAN配置及具体解析(基于接口的VLAN划分-access、trunk和hybrid,基于Mac地址的VLAN划分)】-20211201
- windows计算机锁屏的快捷键是什么,win7的锁屏快捷键是什么 win7锁屏快捷键介绍【图文】...
- foxmail远程主机强迫关闭了一个现有的连接
- Visual C++ 11 中新的并发功能
- ubuntu服务器ftp无法上传文件,ubuntu服务器上传文件ftp
- 【数据分析师_02_SQL+MySQL】022_MySQL的全文检索(MyISAM,MATCH AGAINST)
- uIP TCP/IP协议栈
- ESP32 ESP-IDF 项目文件结构
- 5800日常操作使用小技巧
- B S架构 服务器虚拟化,基于KVM的B/S架构虚拟化管理系统