根据条件复制spark数据框中的行

时间:2019-07-24 10:32:53

标签: scala apache-spark apache-spark-sql

我有一个数据框,它看起来像这样:

+-------------+---------+-------+
|Timestamp    |Usercount|IsoWeek|
+-------------+---------+-------+
|2019-07-21 00|21       |29     |
|2019-07-21 01|22       |29     |
|2019-07-21 02|23       |29     |
|2019-07-21 03|24       |29     |
|2019-07-21 04|25       |29     |
|2019-07-21 05|26       |29     |
|2019-07-21 06|27       |29     |
|2019-07-21 07|28       |29     |
|2019-07-21 08|29       |29     |
|2019-07-21 09|30       |29     |
|2019-07-21 10|31       |29     |
|2019-07-21 11|32       |29     |
|2019-07-21 12|33       |29     |
|2019-07-21 13|34       |29     |
|2019-07-21 14|35       |29     |
|2019-07-21 15|36       |29     |
|2019-07-21 16|37       |29     |
|2019-07-21 17|38       |29     |
|2019-07-21 18|39       |29     |
|2019-07-21 19|40       |29     |
|2019-07-21 20|41       |29     |
|2019-07-21 21|42       |29     |
|2019-07-21 22|43       |29     |
|2019-07-21 23|44       |29     |
|2019-07-22 00|22       |30     |
|2019-07-22 01|23       |30     |
|2019-07-22 02|24       |30     |
|2019-07-22 03|25       |30     |
|2019-07-22 04|26       |30     |
|2019-07-22 05|27       |30     |
|2019-07-22 06|28       |30     |
|2019-07-22 07|29       |30     |
|2019-07-22 08|30       |30     |
|2019-07-22 09|31       |30     |
|2019-07-22 10|32       |30     |
|2019-07-22 11|33       |30     |
|2019-07-22 12|34       |30     |
|2019-07-22 13|35       |30     |
|2019-07-22 14|36       |30     |
|2019-07-22 15|37       |30     |
|2019-07-22 16|38       |30     |
|2019-07-22 17|39       |30     |
|2019-07-22 18|40       |30     |
|2019-07-22 19|41       |30     |
|2019-07-22 20|42       |30     |
|2019-07-22 21|43       |30     |
|2019-07-22 22|44       |30     |
|2019-07-22 23|45       |30     |
|2019-07-23 00|23       |30     |
|2019-07-23 01|24       |30     |
|2019-07-23 02|25       |30     |
|2019-07-23 03|26       |30     |
|2019-07-23 04|27       |30     |
|2019-07-23 05|28       |30     |
|2019-07-23 06|29       |30     |
|2019-07-23 07|30       |30     |
|2019-07-23 08|31       |30     |
|2019-07-23 09|32       |30     |
|2019-07-23 10|33       |30     |
|2019-07-23 11|34       |30     |
|2019-07-23 12|35       |30     |
|2019-07-23 13|36       |30     |
|2019-07-23 14|37       |30     |
|2019-07-23 15|38       |30     |
|2019-07-23 16|39       |30     |
|2019-07-23 17|40       |30     |
|2019-07-23 18|41       |30     |
|2019-07-23 19|42       |30     |
|2019-07-23 20|43       |30     |
|2019-07-23 21|44       |30     |
|2019-07-23 22|45       |30     |
|2019-07-23 23|46       |30     |
+-------------+---------+-------+

我正在使用 4小时的窗口对数据进行分组

val numUSersDF = df
      .groupBy(
        window(col("Timestamp"), "4 hours", "2 hours")
      )
      .agg(
        countDistinct("Usercount").alias("NumUsers")
      )

因为它是一个4小时的窗口,所以当时间戳记在 23 小时结束时,从第二天起需要2个小时才能正确进行计算。

如果数据是连续的,那不是问题,但是如果数据也按 IsoWeek 进行分组,则将造成问题,因为第二天的第二个小时不包含在分组集中中。

如何做到这一点,以便第二天2小时成为两个星期的一部分,所以不会中断执行。

类似于以下内容:

+-------------+---------+-------+
|Timestamp    |Usercount|IsoWeek|
+-------------+---------+-------+
|2019-07-21 20|41       |29     |
|2019-07-21 21|42       |29     |
|2019-07-21 22|43       |29     |
|2019-07-21 23|44       |29     |
|2019-07-22 00|22       |29     |  <------
|2019-07-22 01|23       |29     |  <------
|2019-07-22 00|22       |30     |
|2019-07-22 01|23       |30     |
|2019-07-22 02|24       |30     |
|2019-07-22 03|25       |30     |

所以我可以轻松地按 IsoWeek 分组,第二天2小时就是其中的一部分。

任何帮助将不胜感激。

0 个答案:

没有答案