如果不存在,则使用 withColumn 创建一个新列

Posted

技术标签:

【中文标题】如果不存在,则使用 withColumn 创建一个新列【英文标题】:Create a new column with withColumn if it doesn't exist 【发布时间】:2021-12-30 05:56:30 【问题描述】:

我有一个包含一些列的数据框,假设它们被称为

|State| Color|Count 

我想检查该数据框中是否存在列,因此我必须创建它。我知道对于这个小例子来说这样做是没有用的,因为我只有 3 列,我可以手动完成,但我想知道如何使用更大的 DF 来完成。 我首先想到的是:

var cols = df.columns
df.withColumn("x", when(col("x").between(cols(0), cols(cols.length-1)), 5).otherwise(null))

我的意图是检查列“x”是否在 DF 中(在其列的集合中),如果不是,则使用带有 null 值的 withColumn 方法创建它,但我没有知道这是否正确。 还有其他方法吗? 我的其他想法是使用 foreach 循环和 ifs 来实现,但我认为这样做效率不高。

【问题讨论】:

【参考方案1】:

按照你的意图,我不知道你为什么要完全用 withColumn 来做?

我认为一种更简单、更高效、更易读的方法是

val df2 = if (!df.columns.contains("x")) 
             df.withColumn("x", lit(null))
           else 
             df
          

【讨论】:

你需要小心这个。问题提到'我想知道如何使用更大的 DF 来做到这一点'。 documentation for withColumn 警告:“此方法在内部引入了投影。因此,多次调用它,例如,通过循环以添加多个列可能会生成大计划,这可能会导致性能问题甚至 ***Exception。避免这种情况,请同时对多列使用 select。" 同意你的意见。但我对问题的解释是大 df 和大列数,但只检查一列 "x" 。可能是我错了。【参考方案2】:

给定以下示例DataFrame

val df = Seq(
  ("a", "blue", 2),
  ("b", "red", 1),
  ("c", "yellow", 3),
  ("d", "blue", 4),
).toDF("state", "colour", "count")

您可以检查缺少的列并使用以下内容添加它们:

val expectedColumns = Set("state", "colour", "count", "x")
val actualColumns = df.columns
val missingColumns = (expectedColumns -- actualColumns.toSet).map(lit(null).as(_))
df.select(actualColumns.map(col) ++ missingColumns: _*)

您指定您希望出现的列 (expectedColumns),然后将其与 df 中的内容进行比较。如果缺少任何内容,请创建一列具有适当名称的 null 值,然后使用 select 语句将它们重新添加。

【讨论】:

以上是关于如果不存在,则使用 withColumn 创建一个新列的主要内容,如果未能解决你的问题,请参考以下文章

如果存在则更改表,如果不存在则创建

检查节点是不是存在,如果不存在则创建

android sqlite 如果不存在则创建表

如果文件不存在则创建文件,然后将日志写入其中

Linux脚本练习之script004-编写一个程序,先查看 `/root/test/logical` 这个名称是否存在,如果不存在,则创建一个文件。使用 `touch` 来创建,创建完成后离开。

PostgreSQL:如果不存在则创建表 AS