在 Big Query 中将 URL 替换为该 URL 的一部分
Posted
技术标签:
【中文标题】在 Big Query 中将 URL 替换为该 URL 的一部分【英文标题】:Replacing URL with part of that URL in Big Query 【发布时间】:2016-08-16 12:11:25 【问题描述】:我正在尝试在大查询中编写 SQL 以将下面的字符串替换为字符串的中间部分
sports.xxxx.com/en-gb/betting/football/vasdas
sports.xxxx.com/en-gb/betting/basketball/blablabla
sports.xxxx.com/en-gb/betting/football/
sports.xxxx.com/en-gb/betting/golf
所以结果是
football
basketball
football
golf
我尝试使用
SELECT
REGEXP_REPLACE('sports.xxxx.com/en-gb/betting/football', '.*', '(?<=\b\/betting\/)(\w+)')
但我收到一个错误Error: Invalid string literal: '(?<=\b\/betting\/)(\w+)'
有什么想法可以做到吗?
【问题讨论】:
试试SELECT REGEXP_EXTRACT('sports.ladbrokes.com/en-gb/betting/football', r'(?<=\b/betting/)\w+')
Error: Failed to parse regular expression "(?<=\b/betting/)\w+": invalid perl operator: (?<
好的,所以,你需要一个带有REGEX_EXTRACT
的捕获组:SELECT REGEXP_EXTRACT('sports.ladbrokes.com/en-gb/betting/football', r'\b/betting/(\w+)')
成功了,非常感谢!
太好了,我发布了一个带有解释的答案。
【参考方案1】:
错误是由于您在字符串文字中使用的单个反斜杠形成了无效的转义序列。
你需要一个带有REGEX_EXTRACT
的捕获组:
SELECT REGEXP_EXTRACT('sports.ladbrokes.com/en-gb/betting/football', r'\b/betting/(\w+)')
见regex demo
另请注意,Big Query 正则表达式语法由 RE2 正则表达式库提供支持,该库根本不支持环视(并且您尝试使用积极的 loobehind (?<=....)
)。
图案详情:
\b
- 单词边界(尾随)。这可能是不必要的,您可以安全地删除它
/betting/
- 文字子字符串 /betting/
(注意正斜杠对于正则表达式不是特殊的,它们不需要转义)
(\w+)
- 第 1 组,将由 REGEX_EXTRACT
返回的字符串部分,捕获 1 个或多个单词字符(字母、数字或下划线)。
【讨论】:
【参考方案2】:正则表达式是非常强大但昂贵的功能 如果您可以选择避免使用它而使用更便宜的功能 - 您至少应该尝试
SELECT
SUBSTR(url, 1 + LENGTH('sports.xxxx.com/en-gb/betting/'),
INSTR(REPLACE(url + '/', 'sports.xxxx.com/en-gb/betting/', ''), '/') - 1
) as sport
FROM
(SELECT 'sports.xxxx.com/en-gb/betting/football/vasdas' AS url),
(SELECT 'sports.xxxx.com/en-gb/betting/basketball/blablabla' AS url),
(SELECT 'sports.xxxx.com/en-gb/betting/football/' AS url),
(SELECT 'sports.xxxx.com/en-gb/betting/golf' AS url)
在处理大量行时,上述方法可以避免出现 Resource exceeded 或 Timeout 等错误(当然取决于您的实际查询)。此外,您应该始终关注计费层 - 对于使用正则表达式的昂贵查询,这可能会更高
【讨论】:
以上是关于在 Big Query 中将 URL 替换为该 URL 的一部分的主要内容,如果未能解决你的问题,请参考以下文章
在 Google Big Query 中将两个数组连接在一起
在 Google Big Query 中使用 bq 命令行执行查询
当Big Query加载失败并且CSV表遇到太多错误时,获取更多信息,放弃[重复]