BigQuery解析URL网址

问题描述 投票:1回答:4

我需要帮助来使用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
4个回答
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


4
投票

我认为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
投票

以下是BigQuery Standard 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  

0
投票

提供JavaScript UDF解决方案。不是因为它对这种情况更好,但是当事情变得非常复杂时,它总是你最后的希望。

(另外,我想指出,在网址中可能存在双斜杠,例如: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
)
© www.soinside.com 2019 - 2024. All rights reserved.