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

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

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

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

解决方法的思路如下:

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

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

可以看到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

 

 

你可能感兴趣的:(Hive)