在Spark中联接两个具有不同记录和大小的数据框

时间:2019-07-24 23:51:23

标签: scala dataframe join

似乎这个问题问了几次,但是先前问题中提出的解决方案对我不起作用。

我有两个尺寸不同的数据框,如下图所示。表2 second是表first的一部分,但是在对其进行了一些处理之后,我又添加了一个列column4。现在,我想联接这两个表,以便联接后有三个表Required

尝试过的事情。

所以我做了几个不同的解决方案,但是没人适合我。

我尝试了

val required =first.join(second, first("PDE_HDR_CMS_RCD_NUM") === second("PDE_HDR_CMS_RCD_NUM") , "left_outer")

我也尝试过

val required = first.withColumn("SEQ", when(second.col("PDE_HDR_FILE_ID") === (first.col("PDE_HDR_FILE_ID").alias("PDE_HDR_FILE_ID1")), second.col("uniqueID")).otherwise(lit(0)))

在第二次尝试中,我遇到一个错误

时使用.alias
  

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

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

enter image description here

1 个答案:

答案 0 :(得分:1)

要生成所需结果,应将第一个表中行标识的列中的两个表连接起来。假设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|
// +---+---+---+----+