使用多列作为存储在 Apache Spark 数组中的键连接两个数据帧
Join of two Dataframes using multiple columns as keys stored in an Array in Apache Spark
如何使用多列作为键来计算两个Dataframes的连接?例如 DF1 , DF2 是两个dataFrame.
这是我们计算连接的方式,
JoinDF = DF1.join(DF2, DF1("column1") === DF2("column11") && DF1("column2") === DF2("column22"), "outer")
但我的问题是如何访问存储在数组中的多列,例如:
DF1KeyArray=Array{column1,column2}
DF2KeyArray=Array{column11,column22}
那么用这个方法计算join是不行的
JoinDF = DF1.join(DF2, DF1(DF1KeyArray)=== DF2(DF2KeyArray), "outer")
在这种情况下错误是:
<console>:128: error: type mismatch;
found : Array[String]
required: String
有什么方法可以访问多个列作为存储在数组中的键来计算连接?
您可以简单地以编程方式创建 joinExprs
:
val df1KeyArray: Array[String] = ???
val df2KeyArray: Array[String] = ???
val df1: DataFrame = ???
val df2: DataFrame = ???
val joinExprs = df1KeyArray
.zip(df2KeyArray)
.map{case (c1, c2) => df1(c1) === df2(c2)}
.reduce(_ && _)
df1.join(df2, joinExprs, "outer")
另见
如何使用多列作为键来计算两个Dataframes的连接?例如 DF1 , DF2 是两个dataFrame.
这是我们计算连接的方式,
JoinDF = DF1.join(DF2, DF1("column1") === DF2("column11") && DF1("column2") === DF2("column22"), "outer")
但我的问题是如何访问存储在数组中的多列,例如:
DF1KeyArray=Array{column1,column2}
DF2KeyArray=Array{column11,column22}
那么用这个方法计算join是不行的
JoinDF = DF1.join(DF2, DF1(DF1KeyArray)=== DF2(DF2KeyArray), "outer")
在这种情况下错误是:
<console>:128: error: type mismatch;
found : Array[String]
required: String
有什么方法可以访问多个列作为存储在数组中的键来计算连接?
您可以简单地以编程方式创建 joinExprs
:
val df1KeyArray: Array[String] = ???
val df2KeyArray: Array[String] = ???
val df1: DataFrame = ???
val df2: DataFrame = ???
val joinExprs = df1KeyArray
.zip(df2KeyArray)
.map{case (c1, c2) => df1(c1) === df2(c2)}
.reduce(_ && _)
df1.join(df2, joinExprs, "outer")
另见