我最近开始在Spark Scala上开发,我在尝试加入同一表的2个数据范围时遇到了一个问题:
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".
是否可以检查两个列中数据是否已经存在,以避免双向关系?
您可以使用 <
而不是 =!=
比较 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] |
// +---------------+---------------+
edit 当然,您也可以将加入AS-IS留下,并过滤后词:
B1.joinWith(B2, B1("AID") === B2("AID") && B1("BID") =!= B2("BID"))
.filter($"_1.BID" < $"_2.BID")
as @t。Gaweda指出,它可能更快 - 随时尝试在实际数据上同时尝试:)