使用两列对数据帧进行Scala左连接(不区分大小写)
我创建了下面的方法,它采用两个数据帧;lhs和rhs及其各自的第一列和第二列作为输入。该方法应使用为每个数据帧提供的两列(忽略其大小写敏感度)返回这两个帧之间左连接的结果 我面临的问题是,它更像是一个内部连接。它返回的行数是lhs数据帧中行数的3倍(由于rhs中存在重复值),但由于它是左连接,所以rhs数据帧中的重复和行数应该无关紧要使用两列对数据帧进行Scala左连接(不区分大小写),scala,apache-spark,dataframe,join,apache-spark-sql,Scala,Apache Spark,Dataframe,Join,Apache Spark Sql,我创建了下面的方法,它采用两个数据帧;lhs和rhs及其各自的第一列和第二列作为输入。该方法应使用为每个数据帧提供的两列(忽略其大小写敏感度)返回这两个帧之间左连接的结果 我面临的问题是,它更像是一个内部连接。它返回的行数是lhs数据帧中行数的3倍(由于rhs中存在重复值),但由于它是左连接,所以rhs数据帧中的重复和行数应该无关紧要 def leftJoinCaseInsensitive(lhs: DataFrame, rhs: DataFrame, leftTableColumn: St
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行的联接列中的联接值与多个rhs行的联接值匹配,则联接的dataframe
应具有多个lhs行的联接值与rhs的行的联接值匹配
比如说
lhs dataframe
+--------+--------+--------+
|col1left|col2left|col3left|
+--------+--------+--------+
|a |1 |leftside|
+--------+--------+--------+
及
然后将左
连接为
left joined lhs with rhs
+--------+--------+--------+---------+---------+---------+
|col1left|col2left|col3left|col1right|col2right|col3right|
+--------+--------+--------+---------+---------+---------+
|a |1 |leftside|a |1 |rightside|
|a |1 |leftside|a |1 |rightside|
+--------+--------+--------+---------+---------+---------+
你可以有更多的信息
但由于它是左连接,因此rhs中的重复和行数
数据帧应该无关紧要
不是真的。我觉得你的leftjoinCaseSensitive
方法不错。如果右表具有重复的键列,则左联接仍将产生比左表更多的行,如下所示:
val dfR = Seq(
(1, "a", "x"),
(1, "a", "y"),
(2, "b", "z")
).toDF("k1", "k2", "val")
val dfL = Seq(
(1, "a", "u"),
(2, "b", "v"),
(3, "c", "w")
).toDF("k1", "k2", "val")
leftJoinCaseInsensitive(dfL, dfR, "k1", "k1", "k2", "k2")
res1.show
+---+---+---+----+----+----+
| k1| k2|val| k1| k2| val|
+---+---+---+----+----+----+
| 1| a| u| 1| a| y|
| 1| a| u| 1| a| x|
| 2| b| v| 2| b| z|
| 3| c| w|null|null|null|
+---+---+---+----+----+----+
我建议您创建10-20行的虚拟数据集,并测试代码。最好将您的样本/虚拟数据放在这里。
val dfR = Seq(
(1, "a", "x"),
(1, "a", "y"),
(2, "b", "z")
).toDF("k1", "k2", "val")
val dfL = Seq(
(1, "a", "u"),
(2, "b", "v"),
(3, "c", "w")
).toDF("k1", "k2", "val")
leftJoinCaseInsensitive(dfL, dfR, "k1", "k1", "k2", "k2")
res1.show
+---+---+---+----+----+----+
| k1| k2|val| k1| k2| val|
+---+---+---+----+----+----+
| 1| a| u| 1| a| y|
| 1| a| u| 1| a| x|
| 2| b| v| 2| b| z|
| 3| c| w|null|null|null|
+---+---+---+----+----+----+