Удалить слово из строки на основе соответствующего элемента в массиве - PullRequest
0 голосов
/ 04 июля 2018

У меня есть эта таблица:

Big Query Table

Предположим, что "florio" - это город, содержащийся где-то в столбце массива AllLocationTerms.

Как мне удалить "florio", если он существует в моем списке расположений в столбце массива AllLocationTerms?

Как правило, я хочу удалить все соответствующие элементы в AllLocationTerms из столбца «Запрос».

Может случиться так, что в массиве есть 2 или более слова - "квартиры в Нью-Йорке" как Query и "новые", "йорк". Результатом должны быть «квартиры» в этом случае.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Ниже рассматривается вариант использования, подобный вашему, когда вам нужно проверить 800 000 строк в массиве списка местоположений, который содержит около 40 тыс. Элементов
Таким образом, 40 тыс. Элементов определенно слишком много, чтобы использовать их для построения регулярного выражения, как в моем предыдущем ответе.
Поэтому для решения этой проблемы я предлагаю скорее разбить строку запроса на отдельные слова, сохраняя номер позиции, а затем исключить те, которые являются терминами, путем соединения слева и, наконец, собрать оставшиеся слова обратно в строку

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'florio management apartments' query, 1 clicks, ['battle','creek','iowa','florio'] allLocationTerms UNION ALL
  SELECT 'florio creek management iowa apartments' query, 1 clicks, ['battle','creek','iowa','florio'] allLocationTerms 
)
SELECT *,
  (
    SELECT STRING_AGG(word, ' ' ORDER BY pos) 
    FROM (
      SELECT word, MIN(pos) pos 
      FROM UNNEST(SPLIT(query, ' ')) word WITH OFFSET AS pos
      LEFT JOIN UNNEST(allLocationTerms) term 
      ON word = term
      GROUP BY word
      HAVING COUNT(DISTINCT term) = 0
    )
  ) modified_query
FROM `project.dataset.table`
0 голосов
/ 04 июля 2018

Ниже для BigQuery Standard SQL

#standardSQL
SELECT *, 
  REGEXP_REPLACE(query, 
    (SELECT CONCAT('\\b', STRING_AGG(term, '\\b|\\b'), '\\b') FROM UNNEST(allLocationTerms) term),
  '') modified_query
FROM `project.dataset.table`   

Вы можете проверить, поиграть с выше, используя фиктивные данные, как показано ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'florio management apartments' query, 1 clicks, ['battle','creek','iowa','florio'] allLocationTerms UNION ALL
  SELECT 'florio creek management iowa apartments' query, 1 clicks, ['battle','creek','iowa','florio'] allLocationTerms 
)
SELECT *, 
  REGEXP_REPLACE(query, 
    (SELECT CONCAT('\\b', STRING_AGG(term, '\\b|\\b'), '\\b') FROM UNNEST(allLocationTerms) term),
  '') modified_query
FROM `project.dataset.table`    

результат

Row query                              clicks   allLocationTerms    modified_query   
1   florio management apartments            1   battle              management apartments    
                                                creek        
                                                iowa         
                                                florio       
2   florio creek management iowa apartments 1   battle              management apartments    
                                                creek        
                                                iowa         
                                                florio       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...