我最近开始使用Spark Scala进行开发,我遇到了尝试加入同一个表的2个DataFrame的问题:
DataFrame A:
Column Names:{AID, AName}
Data:{1:a, 2:b, 3:c, 4:d}
和
DataFrame B:
Column Names {BID, AID, BName}
Data: {AB232:1:"Mark", AC32D:1:"Sarah", D2123:1:"John", S23DS:2:"Matthew"}
在这种情况下,我需要得到所有相互关联的名字:
"Mark" - "Sarah" , "Mark" - "John", "Sarah"- "John"
相反,当我尝试加入DataFrame B时(这里B1和B2是B的实例):
B1.joinWith(B2, B1("AID") === B2("AID) && B1("BID") =!= B2("BID") );
在此连接之后,我选择结果表以从两个数据帧中获取BName。
我得到的结果是:
"Mark" - "Sarah" ,"Sarah"- "Mark", "Mark" - "John", "John" - "Mark", "Sarah"- "John", "John"- "Sarah".
我有没有办法检查两列中是否已存在数据,以便避免双向关系?
答案 0 :(得分:1)
您可以使用<
代替=!=
来比较BID
,这样您才能匹配B2.BID
大于B1.BID
的记录,因此只有一个每场比赛的“实例”都加入了:
B1.joinWith(B2, B1("AID") === B2("AID") && B1("BID") < B2("BID")).show()
// +---------------+---------------+
// |_1 |_2 |
// +---------------+---------------+
// |[AB232,1,Mark] |[D2123,1,John] |
// |[AB232,1,Mark] |[AC32D,1,Sarah]|
// |[AC32D,1,Sarah]|[D2123,1,John] |
// +---------------+---------------+
编辑当然您也可以按原样保留联接,并过滤后跟:
B1.joinWith(B2, B1("AID") === B2("AID") && B1("BID") =!= B2("BID"))
.filter($"_1.BID" < $"_2.BID")
正如@T. Gaweda指出的那样,它可能会更快 - 可以随意尝试实际数据并看到:)