使用多列作为密钥存储在Apache Spark中的数组中,连接两个Dataframe

时间:2016-02-02 09:57:28

标签: scala apache-spark dataframe join apache-spark-sql

如何使用多列作为键来计算两个Dataframe的连接?例如DF1,DF2是两个dataFrame。

这是我们计算联接的方式,

JoinDF = DF1.join(DF2, DF1("column1") === DF2("column11") && DF1("column2") === DF2("column22"), "outer") 

但我的问题是如果它们存储在如下数组中,如何访问多列:

DF1KeyArray=Array{column1,column2}
DF2KeyArray=Array{column11,column22}

然后无法通过此方法计算连接

JoinDF = DF1.join(DF2, DF1(DF1KeyArray)=== DF2(DF2KeyArray), "outer")

在这种情况下,错误是:

<console>:128: error: type mismatch;
found   : Array[String]
required: String

有没有办法访问多个列作为存储在数组中的键来计算连接?

1 个答案:

答案 0 :(得分:10)

您只需以编程方式创建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")

另见Including null values in an Apache Spark Join