【发布时间】:2020-08-04 12:06:35
【问题描述】:
我有一个如下所示的 PySpark DataFrame:
+------+-----------+
|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 |
+-----------+-----------------------+
这甚至可以用 PySpark 实现吗?非常感谢任何帮助。
【问题讨论】:
-
你对distinct的定义是什么?
标签: python dataframe apache-spark pyspark window