我有一个元组数组,我想使用它生成一个连接条件(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,因此无法将其作为输入反馈。我可以进行递归,但希望有一种更简单的方法来初始化空列变量并构建查询。想法?
答案 0 :(得分:1)
您可以执行以下操作:
val cond = fieldsToJoin.map(x => col(x._1) === col(x._2)).reduce(_ || _)
leftDF.join(rightDF, cond)
基本上,您首先将数组转换为条件数组(col将字符串转换为列,然后===进行比较),然后reduce在它们之间添加“或”。结果是您可以使用的列。