[英]SQL (Hive) group-by using nulls as wildcard
我有一張這樣的桌子:
group val1 val2 val3
group1 5 . .
group1 . 2 1
group1 . . 3
group2 1 4 .
group2 . . 8
group2 2 . 7
我需要使用 null 值 (.) 作為通配符,計算 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 對完全連接,並將其與所有不同的 group-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
但是,我的數據集非常大(數百萬行)。 並且我可以預期的所有可能組合的數量也非常大(成千上萬)。 這樣的連接太大了。
還有其他方法嗎? 我想知道是否可以使用正則表達式,但我不知道從哪里開始。
在您的示例數據中,只有第三列有多個值。 因此,您可以只為另外兩列填寫一個值:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.