sparksql:对出现在另一个表(两列)中的记录过滤表?

q43xntqr  于 2021-07-12  发布在  Spark
关注(0)|答案(2)|浏览(368)

我有几个表,我想根据另一个表中是否存在两列来筛选其中一个表中的行。各表数据如下
表1:一个哈希可以关联多个项目;一篇文章可以关联到多个散列
用户hasharticle名称hash1article1hash1article2hash2article1hash3article3
表2:每个用户哈希都与一个用户id唯一关联
用户hashuser idhash1id1hash2id2hash3id3
表3:每个商品名称都与一个商品编号唯一关联
物品名称物品编号物品1编号物品2编号物品3编号
表4
用户idarticle numberotherfieldid1number1misc1id2number2misc2id3number3misc3
我想在表4中只保留表1中存在组合(用户id、文章编号)的行(作为用户哈希和文章名称)。在这个例子中,我想得到以下结果:
用户idarticle numberOtherFieldId1NumberMisc1Id3NumberMisc3
在sparksql中实现这一点的最佳方法是什么?我已经尝试过使用join,但是有两个条件,我希望这两个条件在一行中都是有效的。
在我的示例中,id2和number2都在表1中,但不在同一行上,因此我想从表4中筛选出这一行。
我希望这个问题足够清楚。提前谢谢!

wz3gfoph

wz3gfoph1#

可以进行半连接:

select * 
from table4 
left semi join (
    select * from table1 
    join table2 using (`User Hash`) 
    join table3 using (`Article Name`)
) using (`User ID`, `Article Number`)

+-------+--------------+----------+
|User ID|Article Number|OtherField|
+-------+--------------+----------+
|    ID1|       Number1|     Misc1|
|    ID3|       Number3|     Misc3|
+-------+--------------+----------+

或等效地, where exists :

select * 
from table4 
where exists (
    select * from table1 
    join table2 using (`User Hash`) 
    join table3 using (`Article Name`) 
    where `User ID` = table4.`User ID` 
    and `Article Number` = table4.`Article Number`
)
w8rqjzmb

w8rqjzmb2#

如果我理解正确,这只是一堆连接:

select t2.userid, t3.articlenumber
from table1 t1 join
     table2 t2
     on t1.userhash = t2.userhash join
     table3 t3
     on t3.articlename = t1.articlename;

相关问题