如何使用配置单元比较集合

ilmyapht  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(200)

我有以下所有交易的数据,其中每个客户都购买了多个类别的商品。我需要找到一对甚至不共享一个类别的客户。

Customer_id category_id 
  21          3
  21          5
  31          4 
  31          1
  24          3
  24          6
  22          6
  22          5

我试图先使用collect\u set,然后比较交叉连接中的集合,但我不知道hive中有任何这样的函数。有没有可能用一种更简单的方法?以上数据的输出应该是(21,31),(31,24),(31,22),它们是不共享任何类别id的对

SELECT
customer_id, COLLECT_LIST(category_id) AS aggr_set
FROM
    tablename
GROUP BY
    customer_id
yi0zb3m4

yi0zb3m41#

使用 self-join 并计算不匹配的数量和每对客户的总行数。如果他们相等,就意味着他们所有的分类id都不匹配。

select c1,c2
from (
select t1.customer_id as c1,t2.customer_id as c2
,sum(case when t1.category_id=t2.category_id then 0 else 1 end) as mismatches
,count(*) as combinations
from tablename t1
join tablename t2 on t1.customer_id<t2.customer_id
group by t1.customer_id, t2.customer_id
) t
where combinations = mismatches
edqdpe6u

edqdpe6u2#

您可以使用 cross join 然后是聚合:

select t1.customer_id, t2.customer_id
from t t1 cross join
     t t2 
group by t1.customer_id, t2.customer_id
having sum(case when t1.category_id = t2.category_id then 1 else 0 end) = 0;

相关问题