сохраняйте отдельные строки только при выполнении collect_set над движущейся оконной функцией в улье - PullRequest
1 голос
/ 23 мая 2019

Допустим, у меня есть таблица улья, которая имеет 3 строки: merchant_id, week_id, acc_id. Моя цель - собирать уникальных клиентов в предыдущие 4 недели для каждой недели, и я использую для этого скользящее окно.

Мои коды:

создать тестовую таблицу:

CREATE TABLE table_test_test (merchant_id INT, week_id INT, acc_id INT);

INSERT INTO TABLE table_test_test VALUES  
(1,0,8),  
(1,0,9),  
(1,0,10),  
(1,2,1),  
(1,2,2),  
(1,2,4),  
(1,4,1),  
(1,4,3),  
(1,4,4), 
(1,5,1),  
(1,5,3),  
(1,5,5), 
(1,6,1),  
(1,6,5),  
(1,6,6)

Тогда соберите:

select 
merchant_id, 
week_id, 
collect_set(acc_id) over (partition by merchant_id ORDER BY week_id RANGE BETWEEN 4 preceding AND 0 preceding) as uniq_accs_prev_4_weeks
from 
table_test_test

Таблица результатов:

    merchant_id week_id uniq_accs_prev_4_weeks
1   1   0   []
2   1   0   []
3   1   0   []
4   1   2   [9,8,10]
5   1   2   [9,8,10]
6   1   2   [9,8,10]
7   1   4   [9,8,10,1,2,4]
8   1   4   [9,8,10,1,2,4]
9   1   4   [9,8,10,1,2,4]
10  1   5   [1,2,4,3]
11  1   5   [1,2,4,3]
12  1   5   [1,2,4,3]
13  1   6   [1,2,4,3,5]
14  1   6   [1,2,4,3,5]
15  1   6   [1,2,4,3,5]

Как видите, в таблице есть избыточные строки. Это только пример, в моем случае эта таблица огромна, а избыточность вызывает проблемы с памятью.

Я пытался использовать различные группы, но ни одна из этих работ.

Есть ли хороший способ сделать это? Большое спасибо.

1 Ответ

0 голосов
/ 24 мая 2019

Отличное работает хорошо:

select distinct merchant_id, week_id, uniq_accs_prev_4_weeks 
  from
(
select 
merchant_id, 
week_id, 
collect_set(acc_id) over (partition by merchant_id ORDER BY week_id RANGE BETWEEN 4 preceding AND current row) as uniq_accs_prev_4_weeks
from 
table_test_test
)s;

Результат:

OK
1       0       [9,8,10]
1       2       [9,8,10,1,2,4]
1       4       [9,8,10,1,2,4,3]
1       5       [1,2,4,3,5]
1       6       [1,2,4,3,5,6]
Time taken: 98.088 seconds, Fetched: 5 row(s)

Мой Улей не принимает 0 preceding, я заменил на current row.Похоже, эта ошибка или эта ошибка , моя версия Hive 1.2.Ваш должен хорошо работать с отчетливым добавлением в верхнем подзапросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...