暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Hive Not in 的避坑指南

李二白 2021-09-23
2080

   


     二白又更新啦~~~~

     首先,感谢冯女士和孙先生对本文的大力支持,感谢你们为大数据踩坑专业户做出的卓越贡献,感恩

    收~~~~

   

    首先,我们看一下数据集


table

t_user_full_1d
user_id
user_t
dt
123
a
2021-08-31
124
b
2021-08-31
125null
2021-08-31
126
c
2021-08-31
127null
2021-08-31
128
f
2021-08-31

接下来我们统计user_t 不等于a,b的用户数,统计计算出总用户数,和user_t 等于a,b的数据

    select
    count(1) as total_num,
    count(case when user_t in (a,b) then user_id end) as ab_num,
    count(case when user_t not in (a,b) then user_id end) as n_ab_num,
    count(case when nvl(user_t,0) not in (a,b) then user_id end) as n_ab_num2,
    count(case when user_t is null then user_id end) as null_num
    from t_user_full_1d
    where dt='2021-08-31'

    执行sql之后我们的得到的结果是:

    total_num
    ab_num
    n_ab_numn_ab_num2
    null_num
    6
    2
    2
    4
    2

    从执行结果我们可以看出,同样是计算 user_t not in (a,b),但是得到的结果是不一样的。总结数据后我们可以得出   total_num = ab_num+n_ab_num+null_num

    这个结论和我们日常理解的 in+not in= all  是有出入的。出现这种情况的原因是 null 值导致的。因为在进行in,和not in 的判断中返回的是Boolean类型,但Boolean(null)返回的还是null,所以以上innot in在执行过程中返回的结果是这样的



    user_id
    user_t
    user_t in (a,b)
    user_t not in (a,b)
    123
    a
    True
    False
    124
    b
    True
    False
    125null
    Null
    Null
    126
    c
    False
    True
    127null
    Null
    Null
    128
    f
    FalseTrue

    按照我们的逻辑只统计值为True的数据,所以在 not in的情况下,为null的这部分数据不会被统计到。



        上述问题,在where 条件中会出现同样的情况,大家可以自行验证,所以在使用not in的过程我们不能确认是否有空值是可以做空值处理,保证数据统计的准确性。

        更新结束~~~

    文章转载自李二白,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论