[英]How to add conditional join in spark
我有一个数据框加入条件
df1.as(“ main_data”).join(df2.as(“ mcp”),df1.col(“ id”)。equalTo(df2.col(“ id”))和df1.col(“ name”)。 equalTo(df2.col(“ name”))
在此连接中,第二项检查是有条件的
即,仅当includeNameFlag为false时才应执行df1.col(“ name”)。equalTo(df2.col(“ name”)))
如何将此添加到我的数据框联接
尝试将条件作为字符串包括在内,并与join一起附加
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
尝试使用何时何地条件,但都需要列类型
在数据帧连接中使用此条件的其他解决方案吗?
: 解决方案
使用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|
// +---+----+----+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.