使用Spark连接身份会导致最终数据集中重复的公共(public)密钥列:
val result = ds1.join(ds2, ds1("key") === ds2("key"))
// result now has two "key" columns
这可以通过使用
Seq
而不是比较来避免,这与SQL中的USING
关键字类似:val result = ds1.join(ds2, Seq("key"))
// result now has only one "key" column
但是,这在使用公共(public)密钥+另一个条件进行联接时不起作用,例如:
val result = ds1.join(ds2, ds1("key") === ds2("key") && ds1("foo") < ds2("foo"))
// result has two "key" columns
val result = ds1.join(ds2, Seq("key") && ds1("foo") < ds2("foo"))
// compile error: value && is not a member of Seq[String]
当前摆脱这种情况的一种方法是在之后删除重复的列,但这很麻烦:
val result = ds1.join(ds2, ds1("key") === ds2("key") && ds1("foo") < ds2("foo"))
.drop(ds1("key"))
有没有更自然,更清洁的方法来实现相同的目标?
最佳答案
您可以将等值联接组件和过滤器分开:
ds1.join(ds2, Seq("key")).where(ds1("foo") < ds2("foo"))
关于scala - 在几种条件下联接,没有重复的列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46254874/