SQL (Hive) группировка с использованием нулей в качестве подстановочного знака - PullRequest
0 голосов
/ 12 ноября 2019

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

group   val1   val2   val3

group1   5      .      .
group1   .      2      1
group1   .      .      3
group2   1      4      .
group2   .      .      8
group2   2      .      7

Мне нужно подсчитать вхождения всех возможных комбинаций для каждой группы в Hive, используя нулевые значения (.) В качестве подстановочного знака. Это даст мне такие результаты:

group   val1   val2   val3  cnt

group1   5      2      1     2
group1   5      2      3     2
group2   1      4      8     2
group2   2      4      8     1
group2   2      4      7     1

Я знаю, что могу сделать это, выбрав все отдельные пары group-val1, полностью объединив их со всеми различными парами group-val2, и полностью объединив их со всеми различными парамигруппа-val3 пары. Это дает мне все возможные комбинации для каждой группы, которые я затем могу внутренне объединить с моей таблицей, считая случаи, когда ряд моих исходных данных является подмножеством комбинации.

Примерно так:

create table my_results as 

with combos as (
select *
from (select distinct group, val1 from data) A
full join (select distinct group, val2 from data) B
    on A.group = B.group
full join (select distinct group, val3 from data) C
    on A.group = C.group 
)

select A.group, A.val1, A.val2, A.val3, count(*)
from combos A
inner join data B
    on A.group = B.group
    and (A.val1 = B.val1 OR B.val1 is null)
    and (A.val2 = B.val2 OR B.val2 is null)
    and (A.val3 = B.val3 OR B.val3 is null)
group by A.group, A.val1, A.val2, A.val3

Но! Мой набор данных очень большой (100 миллионов строк), и число всех возможных комбинаций, которые я могу ожидать, также очень большое (10 тысяч). Такое соединение слишком велико.

Есть другой способ? Я задавался вопросом, могу ли я использовать регулярные выражения, но я не знаю, с чего начать.

1 Ответ

0 голосов
/ 12 ноября 2019

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

select group,
       max(max(col1)) over (partition by group) as col1,
       max(max(col2)) over (partition by group) as col2,
       col3,
       count(*)
from data
group by group;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...