使用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/

10-13 08:08