如果不存在,则使用 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 forwithColumn
警告:“此方法在内部引入了投影。因此,多次调用它,例如,通过循环以添加多个列可能会生成大计划,这可能会导致性能问题甚至 ***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 创建一个新列的主要内容,如果未能解决你的问题,请参考以下文章
Linux脚本练习之script004-编写一个程序,先查看 `/root/test/logical` 这个名称是否存在,如果不存在,则创建一个文件。使用 `touch` 来创建,创建完成后离开。