【问题标题】:Joining dataframe and replacing column value in scala加入数据框并替换scala中的列值
【发布时间】:2022-01-21 22:01:12
【问题描述】:

我正在尝试加入两个 apache spark sql DataFrame 并将第一个数据帧的列值替换为另一个。 例如:

Df1:

col1 | col2  |  other columns .... say (col-x, col-y, col-z)
------------ |--------------------------------
x    |  a    |random values
y    |  b    |random values
z    |  c    |random values

Df2:

col1 | col3  | other columns .. say (col-a, col-b, col-c)
-------------|--------------------------------
x    |  a1   |different random values
y    |  b1   |different random values
w    |  w1   |different random values

resultant dataframe should be

DF:

col1 | col2  | other columns of DF1 (col-x. col-y, col-z)
-------------|-------------------------------
a1   |  a    |random values
b1   |  b    |random values
z    |  c    |random values

我需要执行左连接并将 DF1.col1 的值替换为 DF2.col3,只要 DF1.col1 = DF2.col1。 我不知道该怎么做。此外,从上面的示例中可以看出,DF1 除了“col1”和“col2”之外还有更多的列,我不能对所有列都应用 select。 我正在尝试类似的东西,

val df = df1.join(df2, Seq("col1"), "left").select(
  coalesce(df2("col2"), df1("col1")).as("col1")
)

但这似乎不起作用。另外,我认为它会过滤掉 DF1 的其他列。我想保留 DF1 的所有列。

如何在 Scala 中做到这一点?

【问题讨论】:

    标签: scala apache-spark join apache-spark-sql apache-spark-dataset


    【解决方案1】:

    您可以按如下方式构造所需的 3 列。

    val df = df1.join(df2, Seq("col1"), "left").select(coalesce(df2("col3"), df1("col1")).as("col1"),col("col2"), col("colx"))
    

    【讨论】:

      【解决方案2】:

      加入后从“df1”获取所有列,Dataframe可以使用别名:

      val updatedCol1 = coalesce(df2("col3"), df1("col1")).alias("col1")
      val columns = updatedCol1 :: df1.columns
        .filterNot(_ == "col1")
        .map(cname => col("df1." + cname))
        .toList
      
      df1.alias("df1")
        .join(df2, Seq("col1"), "left")
        .select(columns: _*)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 2014-11-12
        • 2018-02-11
        • 2018-09-29
        • 2022-01-14
        相关资源
        最近更新 更多