如何减去蜂巢中的项目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何减去蜂巢中的项目相关的知识,希望对你有一定的参考价值。

我有两个商品列表,每个客户,ItemListA和ItemListB

Customer_id   ItemListA   ItemListB
   24            2,3         3,4,5
   26            6,7         8,9,10
   25            4,5          5,8

我希望ItemListB中的Item不在ItemListA中,因此输出应为:

Customer_id   ItemListB_A
     24          4,5
     26          8,9,10
     25          4,8

我不知道如何从Hive中的两个字符串中减去项目。我知道COLLECT_SET但它可以删除重复但不删除项目交集。

答案

这将给出期望的结果。

  select Customer_id, collect_list(y) from
    (select Customer_id, y , count(*) as cnt from 
    (select Customer_id,y from (select Customer_id, split(concat_ws(',',ItemListA,ItemListB),',') as x from table_name) temp lateral view explode(x) temp as y) temp1 
    group by Customer_id,y  ) temp2 where cnt =1 group by Customer_id;
另一答案
select      customer_id
           ,concat_ws (',',collect_list (item)) as ItemListB_A

from       (select      t.customer_id
                       ,pe.item

            from        mytable     t
                        lateral view posexplode (split (concat_ws(',',ItemListA,ItemListB),',')) pe as pos,item

            group by    t.customer_id
                       ,pe.item

            having      count (case when pos < size(split(ItemListA,',')) then 1 end) = 0  
            ) t

group by    customer_id              

+-------------+-------------+
| customer_id | itemlistb_a |
+-------------+-------------+
|          24 | 4,5         |
|          25 | 8           |
|          26 | 10,8,9      |
+-------------+-------------+
另一答案
select      customer_id

           ,split
            (
                regexp_replace
                (
                    concat(ItemListB,',:,',ItemListA)
                   ,'(?<=^|,)(?<item>.*?),(?=.*(?<=,)\k<item>(?=,|$))'
                   ,''
                )
               ,',?:'
            )[0]        as ItemListB_A

from        mytable

+-------------+-------------+
| customer_id | itemlistb_a |
+-------------+-------------+
|          24 | 4,5         |
|          26 | 8,9,10      |
|          25 | 8           |
+-------------+-------------+
另一答案
select a.Customer_id,concat_ws (',',collect_list (a.item)) as ItemListB_A from (            
select      t.Customer_id
                       ,pe.item

            from        test_hive     t
                        lateral view posexplode (split (concat_ws(',',ItemListB),',')) pe as pos,item
                        lateral view posexplode (split (concat_ws(',',ItemListA),',')) pe1 as pos1,item1
            group by t.Customer_id,pe.item
            having count(case when item=item1 then 1 end)=0
)a
group by a.Customer_id

以上是关于如何减去蜂巢中的项目的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python中的映射函数将项目从一个列表减去另一个列表

蜂巢中的分组/窗口化

如何将地图转换为蜂巢中的列?

在 Access 中扫描项目时减去数据库中的数量的 VB 代码

如何从该片段中的 onItemSelectedListener 中获取微调器单击的项目?

如何测试蜂巢中的数字条件?