我在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_cate, true, false]
至 [col_cate, segment_true segment_false]
我该怎么做?
我试过了
output_df.groupBy(["col_cate", "target_bool"]).\
count().\
groupBy("col_cate").\
pivot("target_bool").\
sum("count")
但似乎没有办法在代码中重命名列。我知道我可以给它改名,但感觉不那么优雅。
2条答案
按热度按时间wwodge7n1#
可以在旋转后使用agg和alias方法来完成。
结果:
第二次聚合的原因,我也不清楚。但是,只有当存在多个聚合时才会发生重命名。我正在调查此事。但这应该对你有用。
编辑:正如评论中所指出的,您不需要对它进行两次分组。以下代码将实现此目的:
tst_res1=tst.groupby("col_cate").pivot("target_bool").agg(F.count("target_bool").alias('segment'),F.count("target_bool").alias('dummy'))
3phpmpom2#
可以将列相应地转换为
或者您的sql等效版本如下