我想用PySpark
更改我的Spark DataFrame
特定单元格中的值。在
小例子-我创建了一个模拟Spark DataFrame
:
df = spark.createDataFrame(
[
(1, 1.87, 'new_york'),
(4, 2.76, 'la'),
(6, 3.3, 'boston'),
(8, 4.1, 'detroit'),
(2, 5.70, 'miami'),
(3, 6.320, 'atlanta'),
(1, 6.1, 'houston')
],
('variable_1', "variable_2", "variable_3")
)
运行display(df)
我得到这个表:
{I{I}为第3行指定一个新值。我知道作为df.iloc[4, 3] = 'new_orleans'
或df.loc[4, 'detroit'] = 'new_orleans'
的赋值在Spark
中无效。在
使用when
回答我的问题的有效答案是:
from pyspark.sql.functions import when
targetDf = df.withColumn("variable_3", \
when(((df["variable_1"] == 8) & (df["variable_2"] == 4.1)) , 'new_orleans').otherwise(df["variable_3"]))
我的问题是:是否可以在PySpark
中以更实际的方式完成此操作,而不必输入我只想更改一个单元格的行的所有值和列名(可能在不使用when
函数的情况下实现相同的结果)?在
感谢用户@98064的反馈和帮助。在
可以使用底层RDD创建行号:
现在可以过滤DataFrame以获得所需的行号。在
Spark
DataFrames
是不可变的,不提供随机访问,严格地说是无序的。因此:你能做的是,用新列创建一个新的数据帧,用一些条件表达式替换现有的数据帧,这些条件表达式已经包含在你找到的答案中。在
而且,
monotonically_increasing_id
不添加索引(行号)。它添加单调递增的数字,不一定是连续的或从任何特定值开始(如果是空分区)。在相关问题 更多 >
编程相关推荐