【问题标题】:Regex in Apache hiveApache hive 中的正则表达式
【发布时间】:2023-03-17 00:54:01
【问题描述】:

我使用 Hive 作为数据库,我需要一个 SQL 方法。

我想用域名替换 URL。例如,当我有http://info.myurl.com/some/path/into/the/server 时,我想拥有myurl.com。但是当我有https://myurl.com/ 时,我也想获得myurl.com

我在 Hive 中找到了regexp_extract 函数,所以我到此为止了:

select regexp_extract('http://info.myurl.com/some/path/into/the/server', 'http[s]?://.*?\.([^/]*)', 1) from dual;

现在困难的部分:如何知道域中是否有 1 个或 2 个点,所以我知道是否必须剥离第一个子域?

【问题讨论】:

  • 如果域看起来像 subdomain.myurl.co.uk 怎么办?正确的域名是 myurl.co.uk,也不是 co,uk,对吧?
  • 也可以是www.subdomain.myurl.co.uk
  • 没错,它也可以是具有双顶级域的域(如 co.uk)。这些让事情变得更加困难。

标签: sql regex hive


【解决方案1】:

最后我使用了以下结果:

select
       (case cardinality(split(url_extract_host('http://www.s3.info.test.co.uk/'), '.')) * 10 + length(reverse(split(url_extract_host('http://www.s3.info.test.co.uk/'), '.'))[1])
            when 42 then regexp_extract(url_extract_host('http://info.test.co.uk/'), '[^.]*\.([^/]*)', 1)
            when 52 then regexp_extract(url_extract_host('http://www.info.test.co.uk/'), '(?:[^.]*\.){2}([^/]*)', 1)
            when 62 then regexp_extract(url_extract_host('http://www.s3.info.test.co.uk/'), '(?:[^.]*\.){3}([^/]*)', 1)
            when 33 then regexp_extract(url_extract_host('http://info.test.com/'), '[^.]*\.([^/]*)', 1)
            when 43 then regexp_extract(url_extract_host('http://www.info.test.com/'), '(?:[^.]*\.){2}([^/]*)', 1)
            when 53 then regexp_extract(url_extract_host('http://www.s3.info.test.com/'), '(?:[^.]*\.){3}([^/]*)', 1)
            else url_extract_host('http://test.com/')
           end) as domain
from dual;

凡是提到 URL 的地方,都应该是需要检查的数据库字段。大小写取决于 tld 的字符数(2 或 3)和点之间的元素数。

我不确定它是否是最有效的解决方案,但效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 2019-09-04
    • 1970-01-01
    相关资源
    最近更新 更多