如何在加入后删除具有非空值的重复列?

时间:2017-06-05 15:32:33

标签: 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"), "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”中不存在。

1 个答案:

答案 0 :(得分:0)

我首先使用join运算符single-string usingColumn argument来避免重复加入列名称。

df1.join(df2, "PERIOD_TAG", "fullouter")

负责重复PERIOD_TAG列。

  

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

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

  

合并(e:列*):列返回第一列不是null的列,如果所有输入都是null,则返回null

这看起来完全符合你的情况,避免处理300多列。

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

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