【Hive】explode之后过滤整条数据

工作上遇到的问题,这边复现记录下处理的方法。假设有如下数据:

      id        value
     111    99, 60, 55
     222    90, 102, 99

现在有这样的需求:如果字段value中,有任意一个值大于100,那么就要把这条数据筛选出来。

解决方法的思路如下:

先把value字段用explode炸出来,结果如下

idvalue
11199
11160
11155
22290
222102
22299

可以看到id为222的value为102,大于100,是需要把整个222id的数据筛选出来的。那么如何操作可以把整个222的数据筛选出来而不是只掉上面222、102那一行的数据呢?

第一步:可以对explode之后的每行数据打标签,if(value>100,1,0) as tag

第二步:对id进行group by求和,sum(tag) as tag_sum

第三步:tag_num>0的就过滤掉不满足条件的了,where  tag_sum  > 0

完整的sql如下:

select
id
,value
from
(
   select 
   id
   ,value
   ,sum(tag) as tag_sum
   from 
   (
      select 
      id
      ,value
      ,if(value_new>100,1,0) as tag
      from 
      (
         select 
            id
            ,value
            ,value_new
         from table_xxx
         lateral view explode(split(value,',')) tb as value_new
      ) a
   ) b
   group by 
      id 
      ,value
) c
where tag_sum > 0

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值