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

3gtaxfhh  于 12个月前  发布在  Hive
关注(0)|答案(1)|浏览(235)

我在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=1D.07.01.01=NULD.07.01.01=2
期望的结果是2。
谢谢

已编辑

我设法写了下面的代码,以便有一个包含我的desirec代码的所有值(1,2和Nul)的列表,这样我就可以在以后应用greatest函数:

select split(regexp_replace('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+).*', '$1'), ';')


但这只会返回[“2”]。

rpppsulh

rpppsulh1#

我没有任何可以运行hive的东西来测试。但是这是在一个类似hive的平台上运行的。这是非常脆弱的,如果你有不干净的值(例如D.07.01.01 =带前导或尾随空格),你肯定会想确保它正确地处理它们。希望它是值得思考的。
理由
看起来你的值是用分号分隔的,所以如果你把每个元素分解成行,你就不会受到hive的正则表达式支持的限制(处理匹配数组似乎是一个障碍)。不要把它当作福音,hive可能支持这个或处理它的规范方法,只是没有明显的文档。
然后,cast(replace(els,'D.07.01.01 =','')as integer)将尝试将每个不是'D.07.01.01='的字符转换为整数。对于不是D.07.01.01=的任何字符,这将为null。
然后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.

字符串

相关问题