我有一个表,其中包含属于一个组的所有用户列表。每个用户与组中的部分或全部用户共享了一张照片。有时,用户可能还会与组外的用户共享照片。
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
有人能更好地编写查询来更快地获得答案吗?谢谢!
答案 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