【问题标题】:SQL (Hive) group-by using nulls as wildcardSQL (Hive) group-by 使用空值作为通配符
【发布时间】:2019-11-11 23:10:22
【问题描述】:

我有一张这样的桌子:

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 对完全连接,并将其与所有不同的 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

但是!我的数据集非常大(数百万行),我可以预期的所有可能组合的数量也非常大(数万行)。这样的连接太大了。

还有其他方法吗?我想知道我是否可以使用正则表达式,但我不知道从哪里开始。

【问题讨论】:

    标签: sql hive group-by null wildcard


    【解决方案1】:

    在您的示例数据中,只有第三列有多个值。因此,您可以只为另外两列填写一个值:

    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;
    

    【讨论】:

    • 感谢您的反馈,我的意思是任何列都有多个值,因此编辑了问题。我试图简化案例,以便人们继续阅读!
    猜你喜欢
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2014-12-13
    相关资源
    最近更新 更多