加入后如何删除具有非空值的重复列? [复制]
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
感谢您的解决方案。以上是关于加入后如何删除具有非空值的重复列? [复制]的主要内容,如果未能解决你的问题,请参考以下文章