Запрос улья: выберите столбец на основе условия, в котором значения других столбцов соответствуют некоторым определенным c значениям, затем создайте результат сопоставления как новый столбец - PullRequest
2 голосов
/ 29 мая 2020

Мне нужно выполнить некоторые операции запроса и создания столбцов в HiveQL.

Например,

app      col1

app1     anybody love me?
app2     I hate u
app3     this hat is good
app4     I don't like this one
app5     oh my god
app6     damn you.
app7     such nice girl
app8     xxxxx
app9     pretty prefect
app10    don't love me.
app11    xxx anybody?

Я хочу сопоставить список ключевых слов, например ['anybody', 'love', 'you', 'xxx', 'don't'], и выбрать сопоставленный результат ключевого слова в виде нового столбца с именем keyword следующим образом:

app      keyword

app1     anybody, love
app4     I don't like this one
app6     damn you.
app8     xxx
app10    don't, love
app11    xxx

Кажется, что мне нужно использовать вложенный запрос.
logi c - это что-то вроде выбора сопоставленного результата строк и установка сопоставленных результатов, которые должны быть сохранены в списке или что-то вроде этого как новый столбец.

Но я недостаточно знаком с HiveQL.
Может ли кто-нибудь мне помочь?
Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 29 мая 2020

В Hive вы можете использовать stack UDTF :

with keywords as (
select stack(4, --the number of tuples
'anybody', 'you', 'xxx', 'don\'t'
) as keyword
)

select t.app, k.keyword
from  mytable t
inner join keywords k
    on t.col1 like concat('%', k.keyword, '%')

Также для старых версий hive join использование like не будет работать, используйте перекрестное соединение со стеком и фильтром в ГДЕ:

from  mytable t
cross join keywords k
where t.col1 like concat('%', k.keyword, '%')
1 голос
/ 29 мая 2020

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

select t.app, k.keyword
from  mytable t
inner join (values ('anybody'), ('you'), ('xxx'), ('don''t')) as k(keyword)
    on t.col1 like conca('%', k.keyword, '%')

Обратите внимание, что это будет дублировать app, если более одного ключевого слова соответствует фразе. Вы не указали, как вы хотите обрабатывать этот вариант использования.

В улье вы также можете сформулировать это как:

select t.app, k.keyword
from  mytable t
inner join table(values 'anybody', 'you', 'xxx', 'don''t') as k(keyword)
    on t.col1 like conca('%', k.keyword, '%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...