如何按两列计算组数

时间:2018-04-10 13:20:57

标签: scala

以下是myDf

fi_Sk   sec_SK      END_DATE
89      42          20160122
89      42          20150330
51      43          20140116
51      43          20130616
82      43          20100608
82      43          20160608

以下是我的代码:

val count = myDf.withColumn("END_DATE", unix_timestamp(col("END_DATE"), dateFormat))
                .groupBy(col("sec_SK"),col("fi_Sk"))
                .agg(count("sec_SK").as("Visits"), max("END_DATE").as("Recent_Visit"))
                .withColumn("Recent_Visit", from_unixtime(col("Recent_Visit"), dateFormat))

我的访问次数不正确,我需要按(fi_Sk和sec_SK)分组来计算访问次数 结果应如下所示:

fi_Sk   sec_SK  Visits   END_DATE
89      42        2      20160122
51      43        2      20140116
82      43        2      20160608

目前我正在接受:

fi_Sk   sec_SK  Visits   END_DATE
89      42        2      20160122
51      43        2      20140116

1 个答案:

答案 0 :(得分:0)

groupByaggregation会聚合all the rows in group into one row,但预期的输出似乎是要填充组中每一行的计数。 窗口功能是适合您的

import org.apache.spark.sql.expressions.Window
def windowSpec = Window.partitionBy("fi_Sk", "sec_SK")

import org.apache.spark.sql.functions._
df.withColumn("Visits", count("fi_Sk").over(windowSpec))
//      .sort("fi_Sk", "END_DATE")
//      .show(false)
//
//    +-----+------+--------+------+
//    |fi_Sk|sec_SK|END_DATE|Visits|
//    +-----+------+--------+------+
//    |51   |42    |20130616|2     |
//    |51   |42    |20140116|2     |
//    |89   |44    |20100608|1     |
//    |89   |42    |20150330|2     |
//    |89   |42    |20160122|2     |
//    +-----+------+--------+------+