У меня есть такая таблица:
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 тысяч). Такое соединение слишком велико.
Есть другой способ? Я задавался вопросом, могу ли я использовать регулярные выражения, но я не знаю, с чего начать.