如果不存在,则使用 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
}
我有一个包含一些列的数据框,假设它们被称为
|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
}