如何修改pyspark使用的一行中的一个列值

时间:2018-04-08 04:25:44

标签: pyspark

我想在userid = 22650984时更新值。如何在pyspark平台上执行此操作?感谢您的帮助。

>>>xxDF.select('userid','registration_time').filter('userid="22650984"').show(truncate=False)
18/04/08 10:57:00 WARN TaskSetManager: Lost task 0.1 in stage 57.0 (TID 874, shopee-hadoop-slave89, executor 9): TaskKilled (killed intentionally)
18/04/08 10:57:00 WARN TaskSetManager: Lost task 11.1 in stage 57.0 (TID 875, shopee-hadoop-slave97, executor 16): TaskKilled (killed intentionally)
+--------+----------------------------+
|userid  |registration_time           |
+--------+----------------------------+
|22650984|270972-04-26 13:14:46.345152|
+--------+----------------------------+

3 个答案:

答案 0 :(得分:4)

如果您要修改数据框的子集并保持其余部分不变,最好的选择是使用pyspark.sql.functions.when(),因为使用filterpyspark.sql.functions.where()会移除所有行条件不符合。

from pyspark.sql.functions import col, when

valueWhenTrue = None  # for example

df.withColumn(
    "existingColumnToUpdate",
    when(
        col("userid") == 22650984,
        valueWhenTrue
    ).otherwise(col("existingColumnToUpdate"))
)

何时将第一个参数计算为布尔条件。如果条件为True,则返回第二个参数。您可以将多个when语句链接在一起,如this postthis post所示。或者使用otherwise()指定条件为False时要执行的操作。

在此示例中,我正在更新现有列"existingColumnToUpdate"。当userid等于指定值时,我将使用valueWhenTrue更新列。否则,我们将保持列中的值不变。

答案 1 :(得分:0)

您可以使用withColumn来实现您的目标:

new_df = xxDf.filter(xxDf.userid = "22650984").withColumn(xxDf.field_to_update, <update_expression>)

update_expression会有你的更新逻辑 - 可能是UDF,或派生字段等。

答案 2 :(得分:0)

基于过滤器更改数据框列的值:

public Invoice SelectedInvoice { get => _selectedInvoice; set { if (_selectedInvoice != value) { if (_selectedInvoice != null) // <- add the 'if' block { _selectedInvoice = null; RaisePropertyChanged(() => SelectedInvoice); } _selectedInvoice = value; RaisePropertyChanged(() => SelectedInvoice); } } }