计算结合窗口功能的Spark DF列中的特定值

时间:2018-06-20 23:09:11

标签: apache-spark apache-spark-sql

样本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

关于我要去哪里的任何建议都会很有帮助

1 个答案:

答案 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|
+-------+------+