我需要帮助来使用BigQuery解析Web URL。需要在最后一个正斜杠'/'后删除字符串/文本并返回URL。输入URL长度可以按记录变化。如果输入的URL没有域名地址后面的字符串/文本,则应该按原样返回URL。
这里有些例子。
输入网址
https://www.stackoverflow.com/questions
预期产出
我尝试使用SPLIT函数将URL字符串转换为ARRAY并使用ARRAY_LENGTH计算数组大小。但是,它并未涵盖我上面提到的所有各种情况。
请告知如何解决这个问题?在BigQuery中使用标准SQL?
您可以使用简单的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(第一个捕获组)代表“/”之前的字符,我们需要考虑字符以避免与“//”匹配。
测试结果:
我认为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;
以下是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
提供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
)