我创建了以下方法,它采用两个数据帧; lhs & rhs 及其各自的第一列和第二列作为输入。该方法应使用为每个数据帧提供的两列返回这两个帧之间的左连接结果(忽略它们的大小写敏感性)。
我面临的问题是它正在做更多的内部连接。它返回的行数是 lhs 数据框中行数的 3 倍(由于 rhs 中的重复值),但由于它是左连接,所以 rhs 数据框中的重复和行数应该无关紧要。
def leftJoinCaseInsensitive(lhs: DataFrame, rhs: DataFrame, leftTableColumn: String, rightTableColumn: String, leftTableColumn1: String, rightTableColumn1: String): DataFrame = {
val joined: DataFrame = lhs.join(rhs, upper(lhs.col(leftTableColumn)) === upper(rhs.col(rightTableColumn)) && upper(lhs.col(leftTableColumn1)) === upper(rhs.col(rightTableColumn1)), "left");
return joined
}
最佳答案
如果rhs
中有重复的值,那么lhs
被复制是正常的。如果 lhs row
中连接列的连接值与多个 rhs 行
匹配,则连接的 dataframe
应该有多个 rows
来自 lhs
匹配来自 rhs
的 rows
。
例如
lhs dataframe
+--------+--------+--------+
|col1left|col2left|col3left|
+--------+--------+--------+
|a |1 |leftside|
+--------+--------+--------+
和
rhs dataframe
+---------+---------+---------+
|col1right|col2right|col3right|
+---------+---------+---------+
|a |1 |rightside|
|a |1 |rightside|
+---------+---------+---------+
那么正常有left
join
as
left joined lhs with rhs
+--------+--------+--------+---------+---------+---------+
|col1left|col2left|col3left|col1right|col2right|col3right|
+--------+--------+--------+---------+---------+---------+
|a |1 |leftside|a |1 |rightside|
|a |1 |leftside|a |1 |rightside|
+--------+--------+--------+---------+---------+---------+
您可以了解更多信息here
关于使用两列(不区分大小写)在数据帧上使用 Scala LEFT JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47055535/