Apache spark 如何像使用Spark兼容的SQL PIVOT语句一样重命名pyspark中的列?
我在Spark中运行了这个查询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
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'))