Apache spark 在spark中加入2个数据帧时从数据帧中删除所有列

Apache spark 在spark中加入2个数据帧时从数据帧中删除所有列,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我正在连接两个数据帧,并在最后一个数据帧中使用withColumn方法添加一些列我想要第一个数据帧中的所有列,以及我使用withColumn方法添加的新列我想要从第二个数据帧中删除所有列是否有任何方法可以从第二个数据帧中删除所有列目前我对每一列都使用单独的删除方法 val df3 = df1.join(df2, df1("id") === df2("id")) .drop(df2("name")) .drop(df2("lastname")) 是否有任何方法可以

我正在连接两个数据帧,并在最后一个数据帧中使用
withColumn
方法添加一些列我想要第一个数据帧中的所有列,以及我使用
withColumn
方法添加的新列我想要从第二个数据帧中删除所有列是否有任何方法可以从第二个数据帧中删除所有列目前我对每一列都使用单独的删除方法

val df3 = df1.join(df2, df1("id") === df2("id"))
        .drop(df2("name"))
        .drop(df2("lastname"))

是否有任何方法可以使用单个方法删除所有列,而不是单独删除。

可以按以下方法完成,请查找代码检查的内联注释

val df2ColumnList = df2.columns    // Get the list of df2 columns
val df3 = df1.join(df2, df1("id") === df2("id"))
             .drop(df2ColumnList : _*)  // You can pass the list to drop function

问题是
drop
将只获取
类型的一个值和
字符串
类型的多个值

如果您传递多个类型为
String
的值,则两个加入DFs的字段中可能有相同的列,您可能会丢失该列相关的数据

而不是删除列,只选择需要的列,如下所示

val columns = df1.columns.map(c => df1(c)).toList ::: List(col("with_column_a"),col("with_column_b"))

val df3 = df1.join(df2, df1("id") === df2("id")).select(columns:_*)

val df3 = df1.join(df2, df1("id") === df2("id"))
df2.columns.map(column => df2(column)).foldLeft(df3)((ddf,column) => ddf.drop(column))


当您有多列要从联接中
删除
时,最好的方法是使用
。选择

val df3 = df1.join(df2, df1("id") === df2("id"))
.select("Select all the columns you need")
这样,如果删除了所需的列,则无需考虑太多,因为两个数据帧中可能都有不明确的列

您还可以使用
.selectExpr()
在选择列时使用
as
进行别名处理