Scala 如何在联接后删除具有非空值的重复列?

Scala 如何在联接后删除具有非空值的重复列?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个名为“a”的数据框,其中有300多列,我正试图将名为“a”的数据框与其增量数据“B”连接起来,其模式与“a”相同 加入数据帧后,我得到了重复的列。我用co来避免的 val toPrint = udf((value1: String, value2: String) => if(value1 != null) {value1} else value2) val dfClean = df1.join(df2, df1("PERIOD_TAG") === df2("PERIOD_TAG"

我有一个名为“a”的数据框,其中有300多列,我正试图将名为“a”的数据框与其增量数据“B”连接起来,其模式与“a”相同

加入数据帧后,我得到了重复的列。我用co来避免的

val toPrint = udf((value1: String, value2: String) => if(value1 != null) {value1} else value2)
val dfClean = df1.join(df2, df1("PERIOD_TAG") === df2("PERIOD_TAG"), "fullouter").select(toPrint(df1("PERIOD_SHORT_DESCRIPTION"),df2("PERIOD_SHORT_DESCRIPTION")).alias("PERIOD_SHORT_DESCRIPTION"),toPrint(df1("PERIOD_TAG"),df2("PERIOD_TAG")).alias("PERIOD_TAG"))....so on for all the columns
我正在调用一个UDF来选择重复列中最新的值(来自增量文件)。 增量数据将有少量更新的数据,我需要将这些数据与增量数据帧中的所有新数据以及数据帧“B”的旧数据一起添加

有没有其他方法可以避免单独选择列并使用for循环。
或者,在加入后,是否有任何方法可以获得增量df的新/更新值和数据帧“B”的旧值,这些值在数据帧“A”中不存在。

我首先要使用of
join
操作符避免加入列名中的重复

df1.join(df2, "PERIOD_TAG", "fullouter")
它负责消除重复的
PERIOD\u TAG

与其他连接函数不同,连接列在输出中只出现一次,即类似于使用语法的SQL连接

最后一步是使用合并功能:

coalesce(e:Column*):Column返回不是
null
的第一列,或者如果所有输入都是
null
,则返回
null

这与您的案例非常相似,避免了处理300多个列

val myCol = coalesce($"df1.one", $"df2.one") as "one"
df1.join(df2, "PERIOD_TAG", "inner").
  select(myCol).
  show

因此,练习是为模式中的每一列使用
coalesce
函数来构建
mycl
类似的列序列(这看起来像一个相当简单的编程赋值:)

我首先要使用
join
操作符避免join列名中的重复

df1.join(df2, "PERIOD_TAG", "fullouter")
它负责消除重复的
PERIOD\u TAG

与其他连接函数不同,连接列在输出中只出现一次,即类似于使用语法的SQL连接

最后一步是使用合并功能:

coalesce(e:Column*):Column返回不是
null
的第一列,或者如果所有输入都是
null
,则返回
null

这与您的案例非常相似,避免了处理300多个列

val myCol = coalesce($"df1.one", $"df2.one") as "one"
df1.join(df2, "PERIOD_TAG", "inner").
  select(myCol).
  show

因此,练习是为模式中的每一列使用
coalesce
函数来构建
mycl
式的列序列(这看起来像是一个相当简单的编程赋值:)

这与前面提到的问题非常相似,但它并没有建议如何解决“否”时的选择问题,就我而言,300+。我还想给出连接条件和顺序。这肯定不是重复的,因为列的数量超过了手动编写的数量。更重要的是,当left为null或不为null时,分别选择right或left值。我敢肯定,这是一个比副本更一般的情况。它与前面提到的问题非常相似,但它并没有建议如何克服选择问题,如果没有,列的数量更多,在我的例子中是300+。我还想给出连接条件和顺序。这肯定不是重复的,因为列的数量超过了手动编写的数量。更重要的是,当left为null或不为null时,分别选择right或left值。我相信这比duplicate.df1.join(df2,“PERIOD_TAG”).select(df1(“*”))更一般。show会给我所有与旧行冲突的新行,即使我在旧数据帧上合并,我仍会在列中有重复数据。原则上,我将整个表与重复数据连接起来,然后分离常见的重复值
val-dfClean01=df1.join(df3,Seq(“PRDC_键”),“left”)。select(df1(“*”)val-dfClean02=df3.join(df2,Seq(“PRDC_键”),“left”)。select(df3(“*”)val-dfClean04=dfClean01.unionAll(dfClean02)//这会使用重复数据val-dfClean03=df2连接整个列。join(df3,Seq(“PRDC_键”)。select(df2(“*”)//分离重复的旧数据val finalJoin=dfClean04。除了(dfClean03)//A-B
感谢您的解决方案。df1.join(df2,“句点标记”)。选择(df1(“*”)。show将给我所有与旧数据冲突的新行,即使我在旧数据帧上合并,我仍将在列中保留重复数据。原则上,我将整个表与重复数据连接起来,然后分离常见的重复值
val-dfClean01=df1.join(df3,Seq(“PRDC_键”),“left”)。select(df1(“*”)val-dfClean02=df3.join(df2,Seq(“PRDC_键”),“left”)。select(df3(“*”)val-dfClean04=dfClean01.unionAll(dfClean02)//这会使用重复数据val-dfClean03=df2连接整个列。join(df3,Seq(“PRDC_键”)。select(df2(“*”)//分离重复的旧数据val finalJoin=dfClean04。除了(dfClean03)//A-B
谢谢您的解决方案。