PySpark中满足when子句时的多个操作
在pyspark中,我知道when子句可以有多个条件来生成一个输出,如下所示:PySpark中满足when子句时的多个操作,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,在pyspark中,我知道when子句可以有多个条件来生成一个输出,如下所示: df.withColumn( 'Output', when( (condition1==True) & (condition2==True), do_something) .otherwise(do_something_else) ) 但是,当一个条件满足时,是否可以执行多个输出?像这样: df.when( condition1==True, withColumn('
df.withColumn(
'Output',
when(
(condition1==True) & (condition2==True),
do_something)
.otherwise(do_something_else)
)
但是,当一个条件满足时,是否可以执行多个输出?像这样:
df.when(
condition1==True, withColumn('This', lit("yes"))
& withColumn('That', lit("also yes")))
.otherwise(
withColumn('This', lit("no"))
& withColumn('That', lit("also no"))
)
您可以通过在when/other子句中创建一个结构来实现这一点。您可以在结构中命名和创建尽可能多的字段,并按colname.*进行扩展,如下所示
df.show() #sample dataframe
#+-----+------+
#|Sales|Region|
#+-----+------+
#| 5000| US|
#| 2500| IN|
#| 4500| AU|
#| 4500| NZ|
#+-----+------+
from pyspark.sql import functions as F
df.withColumn("col", F.when(F.col("Region")=='US',\
F.struct(F.lit("yes").alias("This"),F.lit("also yes").alias("That")))\
.otherwise(F.struct(F.lit("no").alias("This"),F.lit("also no").alias("That"))))\
.select(*df.columns,"col.*")\
.show()
#+-----+------+----+--------+
#|Sales|Region|This| That|
#+-----+------+----+--------+
#| 5000| US| yes|also yes|
#| 2500| IN| no| also no|
#| 4500| AU| no| also no|
#| 4500| NZ| no| also no|
#+-----+------+----+--------+
您可以通过在when/other子句中创建一个结构来实现这一点。您可以在结构中命名和创建尽可能多的字段,并按colname.*进行扩展,如下所示
df.show() #sample dataframe
#+-----+------+
#|Sales|Region|
#+-----+------+
#| 5000| US|
#| 2500| IN|
#| 4500| AU|
#| 4500| NZ|
#+-----+------+
from pyspark.sql import functions as F
df.withColumn("col", F.when(F.col("Region")=='US',\
F.struct(F.lit("yes").alias("This"),F.lit("also yes").alias("That")))\
.otherwise(F.struct(F.lit("no").alias("This"),F.lit("also no").alias("That"))))\
.select(*df.columns,"col.*")\
.show()
#+-----+------+----+--------+
#|Sales|Region|This| That|
#+-----+------+----+--------+
#| 5000| US| yes|also yes|
#| 2500| IN| no| also no|
#| 4500| AU| no| also no|
#| 4500| NZ| no| also no|
#+-----+------+----+--------+