从 Spark 中的单个数据帧中删除列列表



我有一个由两个Dataframe s:df1df2连接到df3Dataframe。在df2中找到的所有列也在df1中,但它们的内容不同。我想从连接中删除所有df1列,这些列的名称df2.columns。有没有办法在不使用变量的情况下做到这一点?目前我已经这样做了

var ret = df3
df2.columns.foreach(coln => ret = ret.drop(df2(coln)))

但我真正想要的只是一个捷径

df3.drop(df1(df2.columns(1))).drop(df1(df2.columns(2)))....

不使用变量。

传递列列表不是一种选择,不知道是否因为我使用的是 spark 2.2

编辑:

重要提示:我事先不知道df1df2的列

这可以在执行联接本身时实现。请尝试以下代码

 val resultDf=df1.alias("frstdf").join(broadcast(df2).alias("scndf"),  $"frstdf.col1" === $"scndf.col1", "left_outer").selectExpr("scndf.col1","scndf.col2"...)//.selectExpr("scndf.*")

这将仅包含第二个数据框中的列。希望这有帮助

快捷方式是:

val ret  = df2.columns.foldLeft(df3)((acc,coln) => acc.drop(df2(coln)))

我建议在连接之前删除列。或者,仅选择 df3 中来自 df2 的列:

val ret = df3.select(df2.columns.map(col):_*)

最新更新