我有一个数据框,它给出了一组身份证号码和他们访问某个地点的日期,我正试图在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”)之后,最好的方法是什么
1条答案
按热度按时间aor9mmx11#
在这种情况下,必须使用row\ u number()函数。我已经创建了一个Dataframe
id表示案例中可以针对多个日期显示的人员id。
这是每个日期的计数。
显示每个日期的重复id计数。我总共使用了3个id,每个日期有3个计数,这意味着所有id在每个日期都显式计数。
现在据我所知,您希望一个id在任何日期只计算一次(取决于您想要的是最晚的日期还是最早的日期)。
我要用最新的日期为每个身份证。
上面的行将根据每个id为每个日期的条目分配行号,行号1将引用每个id的最新日期,现在您将根据行号为1的每个id进行计数。这将导致每个id的单个计数(distinct)。
这是输出,我已经应用了针对行号的过滤器,您可以在输出中看到日期是最新的,即在我的例子中是2019。
现在我将使用相同的过滤器对newdf进行计数,该过滤器将返回按日期计算的计数。
这里的总计数是3,不包括以前日期的id,以前是6(因为在多个日期重复id)
我希望它能回答你的问题。