分享

hive 非等值连接问题

jsh0401 发表于 2017-4-15 10:38:51 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 12200
A

cookie_id  xxx



B

cookie_id   bid



C

origin_id   uid



A表左关联B表,关联出bids数组



用bids关联C表的orgin_id ,只要bids数组里其中一个bid包含orgin_id ,就把C表的uid关联出来



最后结果 目的是关联出更多的uid,最后条数要跟A表一致



伪代码:

select a.xxx,(c.uid is null , b.bids[0], c.uid) as uuid

from A a

left outer join (select cookie_id,collect_set(bid)  as bids from B group by cookid_id) b

on a.cookie_id = b.cookie_id

left outer join (select orgin_id,coollect_set(uid) as uid from C group by orgin_id) c

on array_contains(b.bids, c.orgin_id) and b.bids is not null



但是以上语法肯定是错误的,on后面条件不对,放在where里的话,会多对多关联,也得不到最后想要保持A表的条数吧,求大神指教,这个需求改如何解


已有(3)人评论

跳转到指定楼层
1550425634 发表于 2018-3-26 17:50:21
本帖最后由 1550425634 于 2018-3-26 17:52 编辑

先B表和C表实现外连接,再与A表内连接
select cid,collect_set(bid) as bids,collect_set(case when isnotnull(uid) then uid end as uu) as uids from (select a.cid cid, bc.bid bid, bc.uid uid from t_a a left join (select b.cid cid,b.bid bid,c.uid uid from t_b b left outer join t_c c on (b.bid=c.oid)) as bc on (a.cid=bc.cid)) as abc;
连接前的B表
1       1
1       2
2       3
3       4
3       5
3       6
连接前的C表
1       1
3       2
5       3
6       4
连接前的A表
1       苹果
2       梨子
3       核桃
连接之后的abc表
1       1       1
1       2       NULL
2       3       2
3       4       NULL
3       5       3
3       6       4
之后再求集合;主要是uid,这里只合并了uid,bid合并比较简单:
select cid,collect_set( case when isnotnull (uid) then uid end) as uids from abc group by cid;
结果如下:
1       [1]
2       [2]
3       [3,4]
先对B表和C表外连接效率比先对A表和B表进行连接效率要高;
回复

使用道具 举报

fylanyu 发表于 2017-4-15 18:11:24
本帖最后由 fylanyu 于 2017-4-15 18:13 编辑

hive应该只能间接实现不等值链接。难度还是比较大的。
楼主的应用场景是什么?还是自己空想出来的。
回复

使用道具 举报

arsenduan 发表于 2017-4-16 18:04:58
这个难度挺大的。
尝试不止需要懂语法,还需要不断的调试。
这里只说下思路:
楼主是想在on后面加条件。这很容易出现错误。
因为首先第一步:先将三张表建立为一张表。然后在大表的前提下在加where条件。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条