Spark Scala加入相同的数据框并删除双向关系

时间:2016-12-30 10:12:08

标签: scala apache-spark apache-spark-sql

我最近开始使用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".

我有没有办法检查两列中是否已存在数据,以便避免双向关系?

1 个答案:

答案 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指出的那样,它可能会更快 - 可以随意尝试实际数据并看到:)