spark scala按日期的累计唯一计数

tpgth1q7  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(377)

我有一个数据框,它给出了一组身份证号码和他们访问某个地点的日期,我正试图在spark scala中找到一种方法,以获取每天或之前访问过该地点的唯一人员(“id”)的数量,这样,如果一个身份证号码在2019-01-01访问两次,然后在2019-01-01再次访问,就不会被计算两次例如2019-01-07。

df.show(5,false)

+---------------+
|id  |date      |
+---------------+
|3424|2019-01-02|
|8683|2019-01-01|
|7690|2019-01-02|
|3424|2019-01-07|
|9002|2019-01-02|
+---------------+

我希望输出如下所示:我在其中groupby(“date”)并将唯一id的计数作为一个累积数(例如:在2019-01-03旁边,它将给出2019-01-03之前任何一天的id的不同计数)

+----------+-------+
|date      |cum_ct |
+----------+-------+
|2019-01-01|xxxxx  |
|2019-01-02|xxxxx  |
|2019-01-03|xxxxx  |
|...       |...    |
|2019-01-08|xxxxx  |
|2019-01-09|xxxxx  |
+------------------+

在df.groupby(“date”)之后,最好的方法是什么

aor9mmx1

aor9mmx11#

在这种情况下,必须使用row\ u number()函数。我已经创建了一个Dataframe

val df = Seq((1,"2019-05-03"),(1,"2018-05-03"),(2,"2019-05-03"),(2,"2018-05-03"),(3,"2019-05-03"),(3,"2018-05-03")).toDF("id","date")

df.show

+---+----------+
| id|      date|
+---+----------+
|  1|2019-05-03|
|  1|2018-05-03|
|  2|2019-05-03|
|  2|2018-05-03|
|  3|2019-05-03|
|  3|2018-05-03|
+---+----------+

id表示案例中可以针对多个日期显示的人员id。
这是每个日期的计数。

df.groupBy("date").count.show

+----------+-----+
|      date|count|
+----------+-----+
|2018-05-03|    3|
|2019-05-03|    3|
+----------+-----+

显示每个日期的重复id计数。我总共使用了3个id,每个日期有3个计数,这意味着所有id在每个日期都显式计数。
现在据我所知,您希望一个id在任何日期只计算一次(取决于您想要的是最晚的日期还是最早的日期)。
我要用最新的日期为每个身份证。

val newdf = df.withColumn("row_num",row_number().over(Window.partitionBy($"id").orderBy($"date".desc)))

上面的行将根据每个id为每个日期的条目分配行号,行号1将引用每个id的最新日期,现在您将根据行号为1的每个id进行计数。这将导致每个id的单个计数(distinct)。
这是输出,我已经应用了针对行号的过滤器,您可以在输出中看到日期是最新的,即在我的例子中是2019。

newdf.select("id","date","row_num").where("row_num = 1").show()

+---+----------+-------+
| id|      date|row_num|
+---+----------+-------+
|  1|2019-05-03|      1|
|  3|2019-05-03|      1|
|  2|2019-05-03|      1|
+---+----------+-------+

现在我将使用相同的过滤器对newdf进行计数,该过滤器将返回按日期计算的计数。

newdf.groupBy("date","row_num").count().filter("row_num = 1").select("date","count").show

+----------+-----+
|      date|count|
+----------+-----+
|2019-05-03|    3|
+----------+-----+

这里的总计数是3,不包括以前日期的id,以前是6(因为在多个日期重复id)
我希望它能回答你的问题。

相关问题