簡體   English   中英

SQL (Hive) group-by 使用空值作為通配符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM