一尘不染

在Spark中更新数据框列

python

查看新的spark数据框api,尚不清楚是否可以修改数据框列。

我怎么会去改变行的值xy一个数据帧的?

pandas这将是df.ix[x,y] = new_value

编辑:合并以下内容,您不能修改现有数据框,因为它是不可变的,但是您可以返回具有所需修改的新数据框。

如果您只想根据条件替换列中的值,例如np.where

from pyspark.sql import functions as F

update_func = (F.when(F.col('update_col') == replace_val, new_value)
                .otherwise(F.col('update_col')))
df = df.withColumn('new_column_name', update_func)

如果要对列执行某些操作并创建一个添加到数据框的新列:

import pyspark.sql.functions as F
import pyspark.sql.types as T

def my_func(col):
    do stuff to column here
    return transformed_value

# if we assume that my_func returns a string
my_udf = F.UserDefinedFunction(my_func, T.StringType())

df = df.withColumn('new_column_name', my_udf('update_col'))

如果希望新列的名称与旧列的名称相同,则可以添加其他步骤:

df = df.drop('update_col').withColumnRenamed('new_column_name', 'update_col')

阅读 146

收藏
2020-12-20

共1个答案

一尘不染

虽然您不能这样修改列,但是您可以对列进行操作并返回反映该更改的新DataFrame。为此,您首先要创建一个UserDefinedFunction实施操作以应用,然后有选择地将该功能仅应用到目标列。在Python中:

from pyspark.sql.functions import UserDefinedFunction
from pyspark.sql.types import StringType

name = 'target_column'
udf = UserDefinedFunction(lambda x: 'new_value', StringType())
new_df = old_df.select(*[udf(column).alias(name) if column == name else column for column in old_df.columns])

new_df现在具有相同的模式old_df(假设old_df.target_column是类型StringType以及),但在列中的所有值target_column将是new_value

2020-12-20