Apache spark 如何像使用Spark兼容的SQL PIVOT语句一样重命名pyspark中的列?

Apache spark 如何像使用Spark兼容的SQL PIVOT语句一样重命名pyspark中的列?,apache-spark,pyspark,Apache Spark,Pyspark,我在Spark中运行了这个查询 f""" select col_cate, true as segment_true, false as segment_false from ( SELECT

我在Spark中运行了这个查询

f"""
                    select
                        col_cate,
                        true as segment_true,
                        false as segment_false
                    from (
                        SELECT
                            {feature},
                            {target_col},
                            count(*) as cnt
                        from
                            table1
                        group by
                            {feature},
                            {target_col}
                    ) pivot (
                        sum(cnt)
                        for target_bool in (true, false)
                    )
                """)
输入数据如下

+--------+-----------+
|col_cate|target_bool|
+--------+-----------+
|       A|       true|
|       A|      false|
|       B|       true|
|       B|      false|
|       A|       true|
|       A|      false|
|       B|       true|
|       B|      false|
+--------+-----------+
输出数据为

+--------+------------+-------------+
|col_cate|segment_true|segment_false|
+--------+------------+-------------+
|       A|        true|        false|
|       B|        true|        false|
+--------+------------+-------------+
然而,当我尝试在pyspark中执行相同操作时,我不知道如何将输出从
[col\u cate,true,false]
重命名为
[col\u cate,segment\u true segment\u false]

我该怎么做

我试过了

output_df.groupBy(["col_cate", "target_bool"]).\
  count().\
  groupBy("col_cate").\
  pivot("target_bool").\
  sum("count")

但是在代码中似乎没有重命名列的方法。我知道我可以在之后重命名它,但它感觉不那么优雅。

你可以在旋转后使用agg和alias方法

import pyspark.sql.functions as F
tst = sqlContext.createDataFrame([('A','true',1),('A','false',2),('B','true',3),('B','false',4),('A','true',5),('A','false',6),('B','true',7),('B','false',8)],schema=['col_cate','target_bool','id'])
#%%
tst_res =tst.groupBy(["col_cate", "target_bool"]).count().groupBy("col_cate").pivot("target_bool").agg(F.sum("count").alias("segment"),F.sum("count").alias("dummy"))
结果:

+--------+-------------+-----------+------------+----------+
|col_cate|false_segment|false_dummy|true_segment|true_dummy|
+--------+-------------+-----------+------------+----------+
|       B|            2|          2|           2|         2|
|       A|            2|          2|           2|         2|
+--------+-------------+-----------+------------+----------+
第二次聚合的原因,dummy,我也不清楚。但只有当存在多个聚合时,才会进行重命名。我正在调查此事。但这应该对你有用

编辑:正如评论中所指出的,您无需将其分组两次。以下代码将用于此目的:
tst\u res1=tst.groupby(“col\u cate”).pivot(“target\u bool”).agg(F.count(“target\u bool”).alias('segment')、F.count(“target\u bool”).alias('dummy'))
您可以相应地变换列 作为

或者您的sql等效版本如下所示

output_df.groupBy(["col_cate", "target_bool"]).\
  count().\
  groupBy("col_cate").\
  pivot("target_bool").\
  sum("count").select(col('col_cate'),col('true').alias('segment_true'),col('false').alias('segment_false'))

我认为两次分组表演有点过分了。
output_df.groupBy(["col_cate", "target_bool"]).\
  count().\
  groupBy("col_cate").\
  pivot("target_bool").\
  sum("count").select(col('col_cate'),col('true').alias('segment_true'),col('false').alias('segment_false'))