【问题标题】:BigQuery parse URL web addressBigQuery 解析 URL 网址
【发布时间】:2019-03-19 21:43:59
【问题描述】:

我需要帮助才能使用 BigQuery 解析出 Web URL。需要删除最后一个正斜杠“/”后的字符串/文本并返回 URL。输入 URL 长度可能因记录而异。如果输入的 URL 没有域地址后的字符串/文本,则应按原样返回 URL。

这里有一些例子。

输入网址

https://www.stackoverflow.com

https://www.stackoverflow.com/questions

https://www.stackoverflow.com/questions/ask

https://stackoverflow.com/questions/ask/some-text

预期输出

https://www.stackoverflow.com

https://www.stackoverflow.com

https://www.stackoverflow.com/questions

https://www.stackoverflow.com/questions/ask

我尝试使用 SPLIT 函数将 URL 字符串转换为 ARRAY 并使用 ARRAY_LENGTH 计算数组大小。但是它并没有涵盖我上面提到的所有各种场景。

请告知如何解决这个问题?在 BigQuery 中使用标准 SQL?

【问题讨论】:

    标签: sql url google-bigquery


    【解决方案1】:

    我认为case 表达式有助于填补空白:

    select (case when url like '%//%/%' then regexp_replace(url, '/[^/]+$', '')
                 else url
            end)
    from (select 'https://www.stackoverflow.com/questions/ask' as url union all
          select 'https://www.stackoverflow.com/questions' as url union all
          select 'https://www.stackoverflow.com' as url
          ) x;
    

    【讨论】:

      【解决方案2】:

      您可以使用简单的 REGEXP_REPLACE 作为最后一个“/”和之后的字符串。

      SELECT REGEXP_REPLACE(url, r"([^/])/[^/]*$", "\\1")
      FROM (SELECT 'https://www.stackoverflow.com/questions/ask' as url UNION ALL
        SELECT 'https://www.stackoverflow.com/questions' as url UNION ALL
        SELECT 'https://www.stackoverflow.com' as url
      )
      

      注意:\\1(第一个捕获组)表示“/”之前的字符,我们需要考虑该字符以避免与“//”匹配。

      测试结果:

      https://www.stackoverflow.com/questions

      https://www.stackoverflow.com

      https://www.stackoverflow.com

      【讨论】:

      • 太棒了!我新有一个更好的方法,但错过了那个技巧。太棒了!
      • 忘了提——你可以用"\\1"代替r"\1"
      • @MikhailBerlyant - 感谢您的帮助!
      • @kshaikh - 当然,也可以考虑为有用的答案投票:o)
      【解决方案3】:

      以下是 BigQuery 标准 SQL

      #standardSQL
      SELECT url, 
        REPLACE(REGEXP_REPLACE(REPLACE(url, '//', '\\'), r'/[^/]+$', ''), '\\', '//')
      FROM `project.dataset.table`  
      

      您可以使用您问题中的示例数据进行测试,使用上面的示例,如下例所示

      #standardSQL
      WITH `project.dataset.table` AS (
        SELECT 'https://www.stackoverflow.com' url UNION ALL
        SELECT 'https://www.stackoverflow.com/questions' UNION ALL
        SELECT 'https://www.stackoverflow.com/questions/ask' UNION ALL
        SELECT 'https://stackoverflow.com/questions/ask/some-text' 
      )
      SELECT url, 
        REPLACE(REGEXP_REPLACE(REPLACE(url, '//', '\\'), r'/[^/]+$', ''), '\\', '//') value
      FROM `project.dataset.table`  
      

      结果

      Row url                                                 value    
      1   https://www.stackoverflow.com                       https://www.stackoverflow.com    
      2   https://www.stackoverflow.com/questions             https://www.stackoverflow.com    
      3   https://www.stackoverflow.com/questions/ask         https://www.stackoverflow.com/questions  
      4   https://stackoverflow.com/questions/ask/some-text   https://stackoverflow.com/questions/ask  
      

      【讨论】:

        【解决方案4】:

        提供 JavaScript UDF 解决方案。不是因为它更适合这种情况,而是当事情变得非常复杂时,它始终是你最后的希望。

        (另外,我想指出,双斜杠可能存在于 url 中,例如:https://www.stackoverflow.com//questions//ask,以处理您可能需要在 JavaScript 中编码的额外逻辑)

        #standardSQL
        CREATE TEMP FUNCTION
          remove_last_part_from_url(url STRING)
          RETURNS STRING
          LANGUAGE js AS """
          var last_slash = url.lastIndexOf('/');
          var first_double_slash = url.indexOf('//');
          if (first_double_slash != -1 
              && last_slash != -1 
              && last_slash != first_double_slash + 1) {
            return url.substr(0, last_slash);
          }
          return url;
          """ ;
        SELECT remove_last_part_from_url(url)
        FROM (SELECT 'https://www.stackoverflow.com/questions/ask' as url UNION ALL
          SELECT 'https://www.stackoverflow.com/questions' as url UNION ALL
          SELECT 'https://www.stackoverflow.com//questions' as url UNION ALL -- double slash after https://
          SELECT 'https:/invalid_url' as url UNION ALL
          SELECT 'https://www.stackoverflow.com' as url
        )
        

        【讨论】:

          猜你喜欢
          • 2021-10-04
          • 2011-04-05
          • 2020-10-21
          • 1970-01-01
          • 1970-01-01
          • 2015-12-24
          • 2022-01-16
          • 2015-12-18
          相关资源
          最近更新 更多