我想在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|
+--------+----------------------------+
答案 0 :(得分:4)
如果您要修改数据框的子集并保持其余部分不变,最好的选择是使用pyspark.sql.functions.when()
,因为使用filter
或pyspark.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 post和this 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);
}
}
}