我想用一个二进制标志的新列覆盖一个 Spark 列。
我尝试直接覆盖列 id2 但为什么它不像 Pandas 中的就地操作那样工作?
如何在不使用 withcolumn() 创建新列和 drop() 删除旧列的情况下做到这一点?
我知道 spark 数据框是不可变的,这是原因还是有不同的覆盖方式而不使用 withcolumn() 和 drop()?
df2 = spark.createDataFrame(
[(1, 1, float('nan')), (1, 2, float(5)), (1, 3, float('nan')), (1, 4, float('nan')), (1, 5, float(10)), (1, 6, float('nan')), (1, 6, float('nan'))],
('session', "timestamp1", "id2"))
df2.select(df2.id2 > 0).show()
+---------+
|(id2 > 0)|
+---------+
| true|
| true|
| true|
| true|
| true|
| true|
| true|
+---------+
# Attempting to overwriting df2.id2
df2.id2=df2.select(df2.id2 > 0).withColumnRenamed('(id2 > 0)','id2')
df2.show()
#Overwriting unsucessful
+-------+----------+----+
|session|timestamp1| id2|
+-------+----------+----+
| 1| 1| NaN|
| 1| 2| 5.0|
| 1| 3| NaN|
| 1| 4| NaN|
| 1| 5|10.0|
| 1| 6| NaN|
| 1| 6| NaN|
+-------+----------+----+
最佳答案
你可以使用
d1.withColumnRenamed("colName", "newColName")
d1.withColumn("newColName", $"colName")
withColumnRenamed
将现有列重命名为新名称。withColumn
创建一个具有给定名称的新列。如果已经存在,它会创建一个具有相同名称的新列并删除旧列。在您的情况下,更改不会应用于原始数据框 df2,它会更改列的名称并作为新数据框返回,该数据框应分配给新变量以供进一步使用。
d3 = df2.select((df2.id2 > 0).alias("id2"))
以上应该适用于您的情况。希望这有帮助!
关于apache-spark - 如何用新列覆盖 Spark 数据框中的整个现有列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44623461/