PySpark Отдельное количество столбцов - PullRequest
0 голосов
/ 04 августа 2020

У меня есть 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 на время windows и получает отдельное количество для каждого из этих раз windows как показано:

+-----------+-----------------------+
|  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? Любая помощь приветствуется.

1 Ответ

1 голос
/ 04 августа 2020

Это то, что вы хотите? или добавьте дополнительные пояснения.

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    |
+----------+-----+
...