我有一个Dataframe
,它是由两个Dataframe
:df1
和df2
连接到df3
中而得到的。在df2
中找到的所有列也在df1
中,但它们的内容不同。我想从联接中删除名称在df1
中的所有df2.columns
列。有没有不用var就能做到这一点的方法吗?
目前,我已经完成了
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
编辑:
重要说明:我事先不知道df1
和df2
的列
答案 0 :(得分:2)
这是可以在执行联接本身时实现的。请尝试以下代码
val resultDf=df1.alias("frstdf").join(broadcast(df2).alias("scndf"), $"frstdf.col1" === $"scndf.col1", "left_outer").selectExpr("scndf.col1","scndf.col2"...)//.selectExpr("scndf.*")
这将仅包含第二个数据帧中的列。希望这会有所帮助
答案 1 :(得分:1)
快捷方式是:
val ret = df2.columns.foldLeft(df3)((acc,coln) => acc.drop(df2(coln)))
我建议删除联接之前的列。或者,仅从df3中选择来自df2的列:
val ret = df3.select(df2.columns.map(col):_*)