BigQuery разбирает URL веб-адрес - PullRequest
1 голос
/ 20 марта 2019

Мне нужна помощь для анализа веб-URL с помощью BigQuery. Нужно удалить строку / текст после последней косой черты '/' и вернуть 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. Однако это не охватывает все различные сценарии, которые я упомянул выше.

Посоветуйте, пожалуйста, как с этим бороться? использование стандартного SQL в BigQuery?

Ответы [ 4 ]

4 голосов
/ 20 марта 2019

Я думаю, что выражение 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 голосов
/ 20 марта 2019

Вы можете использовать простые 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

2 голосов
/ 20 марта 2019

Ниже для 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 голосов
/ 21 марта 2019

Обеспечить решение 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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...