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('

在pyspark中,我知道when子句可以有多个条件来生成一个输出,如下所示:

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|
#+-----+------+----+--------+