Hive - объединяет строки с подстроками поисковых терминов - PullRequest
1 голос
/ 06 февраля 2020

Я получил таблицу журнала результатов поиска с условиями поиска в одном из столбцов. Поскольку результаты поиска создаются как пользовательские типы в поисковых терминах, для каждого поискового термина имеется несколько строк с частичной строкой. Например, когда пользователь вводит world, результирующие строки в таблице будут иметь вид:

ts    | userid      | string_term | number of results
1000  | u22         |    wo       | 35
1002  | u22         |    wor      | 14
1003  | u22         |    worl     | 18
1005  | u22         |    world    | 8
1100  | u22         |    he       | 21
1102  | u22         |    hell     | 11
1103  | u22         |    hello    | 6

Ожидаемые результаты:

ts    | userid      | string_term | number of results
1005  | u22         |    world    | 8
1103  | u22         |    hello    | 6

Я использую Hive и хотел бы знать, Есть ли способ сравнить подстроки в нескольких строках одним и тем же пользователем в течение срока?

Спасибо!

1 Ответ

0 голосов
/ 06 февраля 2020

Вы можете рассматривать это как проблему пробелов и островков. Оглянитесь назад и посмотрите, соответствует ли слово не , а затем накапливается и агрегируется:

with words as (
      select t.*,
             sum(case when prev_word is null or
                           word like prev_word || '%' or
                           prev_ts < ts - 60   -- say within a minute
                      then 1 else 0
                 end) as grp
      from (select t.*, 
                   lag(word) over (partition by userid order by ts) as prev_word,
                   lag(ts) over (partition by userid order by ts) as prev_ts
            from t
           ) t
     )
select w.*
from (select w.*,
             row_number() over (partition by userid, grp order by ts desc) as seqnum
      from words w
     ) w
where seqnum = 1;

На самом деле, есть более простой способ. Просто смотри вперед:

select w.*
from (select t.*, 
             lag(word) over (partition by userid order by ts) as next_word,
              lead(ts) over (partition by userid order by ts) as next_ts
       from t
      ) t
where next_ts is null or
      next_ts > ts + 60 or
      next_word not like word || '%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...