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

Posted

技术标签:

【中文标题】加入后如何删除具有非空值的重复列? [复制]【英文标题】:How to remove duplicate columns with their non-null value after join? [duplicate] 【发布时间】:2017-06-05 15:32:33 【问题描述】:

我有一个名为“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的新/更新值和数据帧“A”中不存在的数据帧“B”的旧值。

【问题讨论】:

它与提到的问题非常相似,但它并没有建议当没有列更多时如何解决选择问题,在我的情况下是 300+。我也想给出加入条件和顺序。 这肯定是不是重复的,因为列的数量超过了人们想要手写的数量。更重要的是,这种情况是分别在 left 为 null 或不为 null 时选择 right 或 left 值。我确信这比给出的副本更普遍。 【参考方案1】:

我首先要避免使用 single-string usingColumn argument 的 join 运算符在连接列名称中重复。

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

这将负责对 PERIOD_TAG 列进行重复数据删除。

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

最后一步是使用合并函数:

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 函数为架构中的每一列构建类似myCol 的列序列(这看起来 像一个相当简单的编程任务:))

【讨论】:

df1.join(df2, "PERIOD_TAG").select(df1("*")).show 会给我所有与旧行冲突的新行,即使我在旧数据框,我的列中仍然会有重复的数据。 原则上,我将整个表与重复数据一起加入,然后分离常见的重复值。 val dfClean01 = df1.join(df3, Seq("PRDC_KEY"), "left" ).select(df1("*")) val dfClean02 = df3.join(df2, Seq("PRDC_KEY"), "left" ).select(df3("*")) val dfClean04= dfClean01.unionAll(dfClean02) //This joins the whole columns with duplicate data val dfClean03 = df2.join(df3, Seq("PRDC_KEY")).select(df2("*")) //Seperates the duplicate old data val finalJoin = dfClean04.except(dfClean03) //A-B 感谢您的解决方案。

以上是关于加入后如何删除具有非空值的重复列? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何获取数据集中具有空值的列的总数? [复制]

复制没有空值的 NSDictionary?

如果值为空,如何在单个查询中更新列的值,然后使用前一个非空值进行更新[重复]

如何从c#中的数组中获取所有非空值[重复]

计算非空值的行

我只需要在 pyspark 数据框中附加那些具有非空值的人