加入与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"))
是否有更自然,更清洁的方法来实现同一目标?
答案 0 :(得分:5)
您可以将equi join组件和过滤器分开:
ds1.join(ds2, Seq("key")).where(ds1("foo") < ds2("foo"))