Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在spark中添加条件联接_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 如何在spark中添加条件联接

Scala 如何在spark中添加条件联接,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个数据帧连接条件,如 df1.as(“主数据”) .join(df2.as(“mcp”)、df1.col(“id”).equalTo(df2.col(“id”))和df1.col(“名称”).equalTo(df2.col(“名称”)) 在此联接中,第二个检查是有条件的 ie df1.col(“名称”).equalTo(df2.col(“名称”)只能执行 如果includeNameFlag为false 如何将其添加到数据帧联接 试图将条件作为字符串包含并随联接一起追加 var joinV

我有一个数据帧连接条件,如

df1.as(“主数据”) .join(df2.as(“mcp”)、df1.col(“id”).equalTo(df2.col(“id”))和df1.col(“名称”).equalTo(df2.col(“名称”))

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

ie df1.col(“名称”).equalTo(df2.col(“名称”)只能执行 如果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

尝试使用when和where条件,但两个条件都是列类型

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


使用
DataFrame
API可以轻松完成。下面是一个快速示例:

val df1 = Seq((1, "foo"), (2, "bar")).toDF("id", "name")
val df2 = Seq((1, "bar"), (2, "bar")).toDF("id", "name")
我使用的equi连接类似于
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|
// +---+----+----+

是否有任何异常或其他输出?如果我理解正确,您会遇到语法问题(“两者都需要列类型”)。从问题中不清楚什么不起作用。但是,在我看来,您有两个问题:1.您试图用字符串连接列类型。2.and运算符使用不正确。请参阅,您可以使用“condition1.and(condition2)”或“condition1&&condition2”。“condition1和condition2”无效。请使用
spark.sql
并根据数据帧中的
if-else
任何其他方式来制定查询?