我有像
这样的数据帧连接条件
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
尝试使用何时何地条件,但都要求列类型
在数据帧连接中使用此条件的任何其他解决方案?
答案 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|
// +---+----+----+