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

Create a new column with withColumn if it doesn't exist

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

|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 中(在其列的集合中),如果不在,则使用带有空值的 withColumn 方法创建它,但我没有'知道这是否正确。 还有其他方法吗? 我的其他想法是用 foreach 循环和 ifs 来实现,但我认为那样效率不高。

给定以下示例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 来做?

我认为更简单、高效和可读的方法是

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