【问题标题】:regexp_extract to find the value in Hiveregexp_extract 在 Hive 中查找值
【发布时间】:2015-11-01 20:17:19
【问题描述】:

我是 regexp_extract 的新手,需要拆分 / 上的列,然后选择第三个值。例如,来自

application/motorola products/routers 

想要获得routers。如果没有第三个值,那么我们需要退回到第二个值,即motorola products。我尝试了以下正则表达式模式,但它不起作用:

(.*?\/)(.*?\/)(.*?)(\/.*\/)

【问题讨论】:

    标签: sql regex hadoop hive


    【解决方案1】:

    您是说单个字符是可选的。给. 一个quantifier *+。我认为这个正则表达式实际上会更好:

    (?:([^\/]+?\/)([^\/]+?)\/([^\/]*)|([^\/]+?\/)([^\/]+))
    

    演示:https://regex101.com/r/dX6uQ9/2

    我没有与hive 合作过/没有hive,因此无法确认这是否可行,但我认为它应该让您更接近方向。

    【讨论】:

      【解决方案2】:

      听起来您只需要 last 值,即最后一个 / 之后的值。正则表达式为[^/]+$:

      select regexp_extract(name, '[^/]+$', 0) from dummy;
      

      如果有两个斜线,则得到第三个值。如果有五个斜线,则得到第六个值。

      如果你想在第三个值处停止,即使有两个以上的斜线,你可以使用这个:

      select regexp_extract(name, '^(?:[^/]+/){0,2}([^/]+)', 1) from dummy;
      

      索引参数1 使其提取在第一个捕获组([^/]+) 中匹配的内容。

      注意:我假设完整的值不会以斜线开始结束,例如/motorola products/routersapplication/motorola products/

      【讨论】:

        【解决方案3】:
        select split('application/motorola products/routers','/')[size(split('application/motorola products/routers','/'))-1]
        

        【讨论】:

        • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-26
        • 1970-01-01
        • 2021-12-29
        • 1970-01-01
        • 2012-04-12
        • 2016-10-26
        相关资源
        最近更新 更多