加入几个没有重复列的条件

时间:2017-09-16 14:17:48

标签: scala apache-spark

加入与Spark的身份导致公共密钥列在最终的数据集中重复:

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

但是,当使用公共密钥+另一个条件加入时,这不起作用,例如:

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"))

是否有更自然,更清洁的方法来实现同一目标?

1 个答案:

答案 0 :(得分:5)

您可以将equi join组件和过滤器分开:

ds1.join(ds2, Seq("key")).where(ds1("foo") < ds2("foo"))