生成动态连接条件火花/标量

时间:2018-08-21 05:17:07

标签: scala apache-spark

我有一个元组数组,我想使用它生成一个连接条件(OR)。

例如

input -->  [("leftId", "rightId"), ("leftId", leftAltId")] 
output -->  leftDF("leftId") === rightDF("rightId") || leftDF("leftAltId") === rightDF("rightAltId")

方法签名:

  def inner(leftDF: DataFrame, rightDF: DataFrame, fieldsToJoin: Array[(String,String)]): Unit = {

  }

我尝试在数组上使用reduce操作,但是我的reduce操作的输出是Column而不是String,因此无法将其作为输入反馈。我可以进行递归,但希望有一种更简单的方法来初始化空列变量并构建查询。想法?

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

val cond = fieldsToJoin.map(x => col(x._1) === col(x._2)).reduce(_ || _)
leftDF.join(rightDF, cond)

基本上,您首先将数组转换为条件数组(col将字符串转换为列,然后===进行比较),然后reduce在它们之间添加“或”。结果是您可以使用的列。