获取字符串中相同输入旁边的最大值

问题描述 投票:0回答:1

我正在开发 Hive:

我有以下字符串:

D.07.01.01=1;B=NUL;A=NUL;D.07.01.01=NUL;R=1;D.07.01.01=2;D.07.01.08=2;D.07.01.07=1;D.07.01.06=2;D.07.01.05=1;D.07.01.04=2;D.07.01.03=1;F=YES;D.07.01.02=1

对于给定的代码(

D.07.01.01
),我想获取其所有出现次数旁边的最大整数,在上面的字符串中,我有
D.07.01.01=1
D.07.01.01=NUL
D.07.01.01=2

期望的结果是2。

谢谢

sql apache-spark hive
1个回答
0
投票

我没有任何可以运行 hive 的东西来确定测试。但这是在一个类似蜂巢的平台上运行的。这是非常脆弱的,如果可以的话,您肯定希望确保它能够正确处理不干净的值(例如 D.07.01.01= 带有前导或尾随空格)。如果没有别的,希望它能引起思考。

基本原理

看起来你的值是用分号分隔的,所以如果你将每个元素分解为行,你就不会受到 hive 乏善可陈的正则表达式支持的限制(处理匹配数组似乎是一个障碍)。不要将此视为福音,hive 可能支持此操作或处理它的规范方法,但没有明显记录。

然后cast(replace(els, 'D.07.01.01=', '') as integer)将尝试将不是'D.07.01.01='的每个字符转换为整数。对于 D.07.01.01= 以外的任何内容,这将为空。

然后 max() 获得最大的整数,当然忽略空值。

SELECT
  max(cast(replace(els, 'D.07.01.01=', '') as integer))
FROM
  (
    select
      'D.07.01.01=1;B=NUL;A=NUL;D.07.01.01=NUL;R=1;D.07.01.01=2;D.07.01.08=2;D.07.01.07=1;D.07.01.06=2;D.07.01.05=1;D.07.01.04=2;D.07.01.03=1;F=YES;' as search_string
  ) raw_value lateral view explode(split(search_string, ';')) elements_delim_by_sc AS els
WHERE els like 'D.07.01.01=%' -- here in case you can have an element with just an integer.
© www.soinside.com 2019 - 2024. All rights reserved.