pyspark列的不同计数

x6yk4ghg  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(536)

我有一个pysparkDataframe,如下所示:

+------+-----------+
|src_ip|  timestamp|
+------+-----------+
|A     |2020-06-19 |
|B     |2020-06-19 |
|B     |2020-06-20 |
|C     |2020-06-20 |
|D     |2020-06-21 |
+------+-----------+

我想检索每个不同ip地址的计数,它被分解为每天可以看到多少不同的ip地址。
我试过:

df.groupBy(window(df['timestamp'], "1 day")) \
           .agg(countDistinct('src_ip')) \
           .orderBy("window").show()

但是,这并没有给出正确的结果,因为它将df拆分为多个时间窗口,并获得每个时间窗口的不同计数,如图所示:

+-----------+-----------------------+
|  window   | count(DISTINCT(src_ip)|
+-----------+-----------------------+
|2020-06-19 | 2                     |
|2020-06-20 | 2                     |
|2020-06-21 | 1                     |
+-----------+-----------------------+

这是不正确的,因为b已经出现在2020-06-19上,应该被分类为不同的。
我想看到的结果表是:

+-----------+-----------------------+
|  window   | count(DISTINCT(src_ip)|
+-----------+-----------------------+
|2020-06-19 | 2                     |
|2020-06-20 | 1                     |
|2020-06-21 | 1                     |
+-----------+-----------------------+

Pypark能做到吗?非常感谢您的帮助。

pftdvrlh

pftdvrlh1#

这就是你想要的吗?或者请多加解释。

df.show(10, False)

+------+----------+
|src_ip|timestamp |
+------+----------+
|A     |2020-06-19|
|B     |2020-06-19|
|B     |2020-06-20|
|C     |2020-06-20|
|D     |2020-06-21|
+------+----------+

from pyspark.sql.functions import min, window, count

df.groupBy('src_ip').agg(min('timestamp').alias('timestamp')) \
  .groupBy('timestamp').agg(count('src_ip').alias('count')) \
  .orderBy('timestamp').show(10, False)

+----------+-----+
|timestamp |count|
+----------+-----+
|2020-06-19|2    |
|2020-06-20|1    |
|2020-06-21|1    |
+----------+-----+

相关问题