在PySpark dataFrame中为特定单元格指定值

时间:2018-05-17 13:58:56

标签: python apache-spark dataframe pyspark

我想使用Spark DataFrame更改PySpark的特定单元格中的值。

琐碎的例子 - 我创建了一个模拟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")
)

Runnning display(df)我得到了这张表:

variable_1   variable_2   variable_3
    1           1.87    new_york
    4           2.76    la
    6           3.3     boston
    8           4.1     detroit
    2           5.7     miami
    3           6.32    atlanta
    1           6.1     houston

例如,我想说,我想为第4行和第3列中的单元格分配一个新值,即更改detroit的{​​{1}}。我知道new_orleansdf.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"])) 中以更实际的方式完成,而无需输入我想要更改1个单个单元格的行的所有值和列名称(可能实现相同)不使用PySpark函数)?

提前感谢您的帮助和@ useruser9806664的反馈。

2 个答案:

答案 0 :(得分:3)

Spark DataFrames 不可变不提供随机访问,严格来说,无序。结果:

  • 您无法分配任何内容(因为不可变属性)。
  • 您无法访问特定行(因为没有随机访问权限。)
  • 行“indcies”定义不明确(因为无序)。

您可以做的是创建一个包含新列的新数据框,使用一些条件表达式替换现有数据,这已经被您找到的答案所涵盖。

此外,monotonically_increasing_id不会添加索引(行号)。它会增加单调递增的数字,不一定是连续的数字或从任何特定值开始(如果是空分区)。

答案 1 :(得分:0)

您可以使用基础RDD创建行号:

from pyspark.sql import Row

# Function to update dataframe row with a rownumber
def create_rownum(ziprow):
    row, index=ziprow
    row=row.asDict()
    row['rownum']= index
    return(Row(**row))

# First create a rownumber then add to dataframe
df.rdd.zipWithIndex().map(create_rownum).toDF().show()

现在,您可以过滤DataFrame以获取所需的行号。