Возможно, это не самое оптимальное, но вполне работоспособное решение.Разделите предложение по разделителю (в моем примере это один или несколько пробелов или запятых), затем взорвитесь и объединитесь, чтобы получить n-грамм, затем соберите массив из n-грамм, используя collect_set
(если вам нужны уникальные n-грамм) или collect_list
:
with src as
(
select source_data.sentence, words.pos, words.word
from
(--Replace this subquery (source_data) with your table
select stack (2,
'This is my sentence',
'This is another sentence'
) as sentence
) source_data
--split and explode words
lateral view posexplode(split(sentence, '[ ,]+')) words as pos, word
)
select s1.sentence, collect_set(concat_ws(' ',s1.word, s2.word)) as ngrams
from src s1
inner join src s2 on s1.sentence=s2.sentence and s1.pos+1=s2.pos
group by s1.sentence;
Результат:
OK
This is another sentence ["This is","is another","another sentence"]
This is my sentence ["This is","is my","my sentence"]
Time taken: 67.832 seconds, Fetched: 2 row(s)