Scala 在Spark中连接两个具有不同记录和大小的数据帧

Scala 在Spark中连接两个具有不同记录和大小的数据帧,scala,dataframe,join,Scala,Dataframe,Join,这个问题似乎被问了好几次,但在前面的问题中提出的解决方案对我不起作用 我有两个不同维度的数据框,如下图所示。表2second是表1first的一部分,但经过一些处理后,我又添加了一列column4。现在我想连接这两个表,这样在连接后就有了表3Required 尝试过的事情 所以我做了两个不同的解决方案,但没有人适合我 我试过了 val required=first.join(第二,第一(“PDE\u HDR\u CMS\u RCD\u NUM”)==second(“PDE\u HDR\u CMS

这个问题似乎被问了好几次,但在前面的问题中提出的解决方案对我不起作用

我有两个不同维度的数据框,如下图所示。表2
second
是表1
first
的一部分,但经过一些处理后,我又添加了一列
column4
。现在我想连接这两个表,这样在连接后就有了表3
Required

尝试过的事情

所以我做了两个不同的解决方案,但没有人适合我

我试过了

val required=first.join(第二,第一(“PDE\u HDR\u CMS\u RCD\u NUM”)==second(“PDE\u HDR\u CMS\u RCD\u NUM”),“left\u outer”)

我也试过了

val required=first.withColumn(“SEQ”),when(second.col(“PDE\u HDR\u FILE\u ID”)==(first.col(“PDE\u HDR\u FILE\u ID”)。alias(“PDE\u HDR\u FILE\u ID1”);second.col(“uniqueID”)。否则(lit(0))

在第二次尝试中,我使用了
.alias
,因为我得到了一个错误

提取过程中发生错误。错误: org.apache.spark.sql.AnalysisException:中缺少已解析属性uniqueID#775L

感谢您抽出时间阅读我的问题


要生成想要的结果,您应该将第一个表中标识行的列上的两个表连接起来。假设
c1+c2+c3
唯一地标识第一个表中的每一行,下面是一个使用部分样本数据集的示例:

import org.apache.spark.sql.functions._
import spark.implicits._

val df1 = Seq(
  (1, "e", "o"),
  (4, "d", "t"),
  (3, "f", "e"),
  (2, "r", "r"),
  (6, "y", "f"),
  (5, "t", "g"),
  (1, "g", "h"),
  (4, "f", "j"),
  (6, "d", "k"),
  (7, "s", "o")
).toDF("c1", "c2", "c3")

val df2 = Seq(
  (3, "f", "e", 444),
  (5, "t", "g", 555),
  (7, "s", "o", 666)
).toDF("c1", "c2", "c3", "c4")

df1.join(df2, Seq("c1", "c2", "c3"), "left_outer").show
// +---+---+---+----+
// | c1| c2| c3|  c4|
// +---+---+---+----+
// |  1|  e|  o|null|
// |  4|  d|  t|null|
// |  3|  f|  e| 444|
// |  2|  r|  r|null|
// |  6|  y|  f|null|
// |  5|  t|  g| 555|
// |  1|  g|  h|null|
// |  4|  f|  j|null|
// |  6|  d|  k|null|
// |  7|  s|  o| 666|
// +---+---+---+----+

谢谢@Leo。如果我有超过100个专栏,我应该在我的加入中提到吗
df1.连接(df2,Seq(“100列”),“left_outer”)。show
@Rahman,不,您只需要包含唯一标识行的最小列集。例如,在示例数据中,如果
c1+c2
足以唯一标识第一个表的每一行,则可以跳过
c3