样本DF:
var some_df = Seq(
("A", "no"),
("B", "yes"),
("B", "yes"),
("B", "no")
).toDF(
"user_id", "phone_number")
some_df.show()
+-------+------------+
|user_id|phone_number|
+-------+------------+
| A| no|
| B| yes|
| B| yes|
| B| no|
+-------+------------+
我正在尝试为每个user_id计数“是”。
代码:
val omg_window = Window.partitionBy($"user_id")
some_df = some_df.withColumn("my_col",
count($"phone_number"==="yes").over(omg_window)).drop("phone_number")
some_df.show()
我的OP:
+-------+------+
|user_id|my_col|
+-------+------+
| B| 3|
| B| 3|
| B| 3|
| A| 1|
+-------+------+
预期的操作次数:
User Id . my_col
B . 2
A . 0
关于我要去哪里的任何建议都会很有帮助
答案 0 :(得分:0)
由于要缩小数据框,请使用groupBy.agg
而不是窗口函数;在这里,您将phone_number
列与yes
字符串($"phone_number" === "yes"
)进行比较,并将结果转换为整数,从而将true
转换为1
,将false
转换为0
,然后通过1
对列进行计数来计算sum
:
some_df.groupBy("user_id").agg(
sum(($"phone_number" === "yes").cast("integer")).as("my_col")
).show
+-------+------+
|user_id|my_col|
+-------+------+
| B| 2|
| A| 0|
+-------+------+