繁体   English   中英

如何在Spark中添加条件联接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM