Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用两列对数据帧进行Scala左连接(不区分大小写)_Scala_Apache Spark_Dataframe_Join_Apache Spark Sql - Fatal编程技术网

使用两列对数据帧进行Scala左连接(不区分大小写)

使用两列对数据帧进行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

我创建了下面的方法,它采用两个数据帧;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行的联接列中的联接值与多个
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|
+---+---+---+----+----+----+