蜂巢:如何比较组成员身份

时间:2018-11-29 03:36:51

标签: sql hive

我有一个表,其中包含属于一个组的所有用户列表。每个用户与组中的部分或全部用户共享了一张照片。有时,用户可能还会与组外的用户共享照片。

table1

group_id   mem_id   shared_mem_id
123        90001    90001
123        90001    90002
123        90001    90003
123        90002    90001
123        90002    90002
123        90003    90002
123        90003    90003

我还有另一个表,其中有该组的花名册。

table2

group_id   mem_id 
123        90001    
123        90002    
123        90003    

我要检查每个用户是否与整个组或部分组共享?在Hive中最有效的方法是什么?

最初,我尝试按以下方式使用完全外部联接,但由于只有在table1的shared_mem_id中也存在mem_id时,它才从table2追加行,所以它不起作用。

select
a.*, 
b.mem_id 

from table1 
full outer join table2 on a.group_id = b.group_id and a.shared_member_id = b.mem_id

然后我最终做了一个collect_set,将所有shared_mem_ids和mem_ids放在同一行并进行了比较。对于一个简单的问题,这似乎需要大量工作。

预期输出:

group_id   mem_id    share_status
123        90001     1
123        90002     0
123        90003     0

有人能更好地编写查询来更快地获得答案吗?谢谢!

2 个答案:

答案 0 :(得分:1)

hive> select * from test_so_t1;
OK
123     90001   90001
123     90001   90002
123     90001   90003
123     90002   90001
123     90002   90002
123     90003   90002
123     90003   90003

hive> select * from test_so_t2;
OK
123     90001
123     90002
123     90003
Time taken: 0.113 seconds, Fetched: 3 row(s)

查询-

select a1.group_id, a1.mem_id, min(case when b1.shared_mem_id is null then 0 else 1 end) from (select distinct a.group_id, a.mem_id, b.mem_id as shared_mem_id from test_so_t1 a, test_so_t2 b) a1 left outer join test_so_t1 b1 on a1.group_id=b1.group_id and a1.mem_id=b1.mem_id and a1.shared_mem_id=b1.shared_mem_id group by a1.group_id, a1.mem_id;

结果

Total MapReduce CPU Time Spent: 30 seconds 590 msec
OK
123     90001   1
123     90002   0
123     90003   0

答案 1 :(得分:0)

您可以在下面尝试

select group_id,mem_id,case when 
    count(distinct shared_mem_id)=(select count(distinct mem_id) from table2 b where a.group_id=b.group_id) then 1 else 0 end as share_status
from table1 a
group by group_id,mem_id