【问题标题】:substring extraction in HQLHQL 中的子字符串提取
【发布时间】:2014-11-12 16:08:17
【问题描述】:

在我的 Hive DB 中有一个 URL 字段是具有这种特定模式的字符串类型:

/Cats-g294078-o303631-Maine_Coon_and_Tabby.html

我想提取字符串末尾附近的两个 Cat“类型”,结果类似于:

mainecoontabby

基本上,我只想提取 - 作为一个小写字符串 - Cat“类型”,它们总是由“_ 和 _”分隔,前面是“-”,后面是“.html”。

在 HQL 中是否有一种简单的方法可以做到这一点?我知道 HQL 的功能有限,否则我会使用正则表达式或子字符串或类似的东西。

谢谢, 克拉克

【问题讨论】:

    标签: sql hadoop hive hql


    【解决方案1】:

    HQL 确实有一个 substr 函数,如下所述:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-StringFunctions 它返回从一个值开始直到结束(或特定长度)的字符串片段

    我还将利用函数locate 来确定 URL 中“-”和“_”的位置。

    只要总是有三个破折号和三个下划线,这应该很简单。

    可能需要 case 语句来确定破折号和下划线的数量,否则。

    【讨论】:

    • 嘿 JJFord3,感谢您的提示 - 经过一些自学后,我设法将一些操作组合在一起并得到了我想要的。准确答案贴在下面。
    【解决方案2】:

    解决方案在这里...

    LOWER(REGEXP_REPLACE(SUBSTRING(catString, LOCATE('-', catString, 19)+1), '(_to_)|(\.html)|_', ''))
    

    有趣的是,以下方法不起作用... JJFord3,知道为什么吗?

    LOWER(REGEXP_EXTRACT(SUBSTRING(FL.url, LOCATE('-', FL.url, 19)+1), '[^(_to_)|(\.html)|_]', 0))
    

    【讨论】:

      猜你喜欢
      • 2014-02-13
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2021-12-23
      • 1970-01-01
      • 2019-07-23
      相关资源
      最近更新 更多