【问题标题】:Spark - How to avoid duplicate columns after join?Spark - 加入后如何避免重复列?
【发布时间】:2018-12-11 04:42:27
【问题描述】:

扩展此处给出的用例: How to avoid duplicate columns after join?

我有两个包含 100 列的数据框。以下是一些带有连接列的示例:

df1.columns
//  Array(ts, id, X1, X2, ...)

df2.columns
//  Array(ts, id, X1, Y2, ...)

之后:

val df_combined = df1.join(df2, df1.X1===df2.X1 and df1.X2==df2.Y2)

我最终得到以下列:Array(ts, id, X1, X2, ts, id, X1, Y2)X1 重复。

我不能使用join(right: Dataset[_], usingColumns: Seq[String]) api,因为要使用这个api,所有列都必须在两个数据框中都存在,这不是这里的情况(X2Y2)。我看到的唯一选择是稍后重命名列并删除列,或者稍后从第二个数据帧中为数据帧和删除列命名。 没有一个简单的api来实现这一点吗?例如。在相等连接的情况下自动删除连接列之一。

【问题讨论】:

  • 您可以选择使用 spark sql 吗?
  • 是的。但我想避免手动选择加入中的所有字段。太多了。
  • 好的,你有多少重复的列?

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


【解决方案1】:

如您所述,避免重复列的最佳方法是使用Seq[String] 作为join 的输入。但是,由于数据框中的列具有不同的名称,因此只有两个选项:

  1. Y2 列重命名为X2,并将join 执行为df1.join(df2, Seq("X1", "X2"))。如果您想在之后保留Y2X2 列,只需将X2 复制到新列Y2

  2. 像以前一样执行join,之后执行drop不需要的重复列:

    df1.join(df2, df1.col("X1") === df2.col("X1") and df1.col("X2") === df2.col("Y2"))
      .drop(df1.col("X1"))
    

不幸的是,目前没有自动的方法来实现这一点。


在加入数据框时,最好确保它们没有相同的列名(join 中使用的列除外)。例如,上面的 tsid 列。如果有很多列,则很难手动重命名它们。要自动执行此操作,可以使用以下代码:

val prefix "df1_"
val cols = df1.columns.map(c => col(c).as(s"$prefix$c"))
df1.select(cols:_*)

【讨论】:

    猜你喜欢
    • 2016-05-17
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多