如何在spark中添加条件连接

时间:2018-02-22 09:01:41

标签: scala apache-spark apache-spark-sql

我有像

这样的数据帧连接条件

  

df1.as( “main_data”)   .join(df2.as(“mcp”),df1.col(“id”)。equalTo(df2.col(“id”))和df1.col(“name”)。equalTo(df2.col(“name” “))

在此联接中,第二项检查是有条件的

  

即df1.col(“name”)。equalTo(df2.col(“name”))应仅执行   如果includeNameFlag为false

如何将此添加到我的数据框连接

尝试将条件包含为字符串并附加连接

var joinVar = ""

if(includeNameFlag == false){

    joinVar = """and df1.col("name").equalTo(df2.col("name"))"""

}else{
    joinVar = ""
}

df1.as("main_data")

.join(df2.as("mcp"),df1.col("id").equalTo(df2.col("id"))+ joinVar)

但那没有帮助。遇到错误就像无法解析id = id + name = name

尝试使用何时何地条件,但都要求列类型

在数据帧连接中使用此条件的任何其他解决方案?

solution

1 个答案:

答案 0 :(得分:2)

可以使用DataFrame API轻松完成。这是一个简单的例子:

val df1 = Seq((1, "foo"), (2, "bar")).toDF("id", "name")
val df2 = Seq((1, "bar"), (2, "bar")).toDF("id", "name")

我正在使用类似于equalTo的等连接。

一方面,根据你的描述:

val includeNameFlag: Boolean = false
val exprs = (if (!includeNameFlag) Seq("id","name") else Seq("id"))

df1.join(df2, exprs).show
// +---+----+
// | id|name|
// +---+----+
// |  2| bar|
// +---+----+

另一方面:

val includeNameFlag: Boolean = true
val exprs = (if (!includeNameFlag) Seq("id","name") else Seq("id"))

df1.join(df2, exprs).show
// +---+----+----+
// | id|name|name|
// +---+----+----+
// |  1| foo| bar|
// |  2| bar| bar|
// +---+----+----+