如何在火花中创建特定的时间范围

Posted

技术标签:

【中文标题】如何在火花中创建特定的时间范围【英文标题】:How to Create specific timeframe in spark 【发布时间】:2019-08-24 16:13:51 【问题描述】:

我有跟踪器数据,我们存储跟踪器编号和到达时间戳

+---------+-------------------+
|trackerno|              adate|
+---------+-------------------+
| 54046022|2019-03-01 18:00:00|
| 54030173|2019-03-01 17:45:00|
| 53451324|2019-03-01 17:50:00|
| 54002797|2019-03-01 18:30:00|
| 53471705|2019-03-01 17:59:00|

我想要 17:44:59 到 17:59:59 之间最后 15 分钟的数据。我正在使用火花应用程序。

预期输出:

+---------+-------------------+
|trackerno|              adate|
+---------+-------------------+
| 54030173|2019-03-01 17:45:00|
| 53451324|2019-03-01 17:50:00|
| 53471705|2019-03-01 17:59:00|

【问题讨论】:

我想要这个每隔几个小时(0-24)。 每次都会有 15 分钟的窗口保持静止。我的意思是它总是有一个特定的开始和结束时间,因为 15 分钟的窗口可以在 0-24 小时之间的任何时间落下。请详细说明 您能添加您到目前为止尝试过的内容吗?听起来像是作业问题,您没有任何尝试。 v_df.distinct().withColumn("timestamp", to_timestamp(unix_timestamp(col("adate")))) .withColumn("Date",date_format(col("timestamp")," yyyy-MM-dd")) .withColumn("time",date_format(col("timestamp"),"HH:mm:ss")) .withColumn("mydata",when(minute($"time"). between(44,59),1).otherwise(0)).show() 【参考方案1】:

你可以试试这样的:

  val df = Seq(
    (54046022, "2019-03-01 18:00:00"),
    (54030173, "2019-03-01 17:45:00"),
    (53451324, "2019-03-01 17:50:00"),
    (54002797, "2019-03-01 18:30:00"),
    (53471705, "2019-03-01 17:59:00")
  ).toDF("trackerno", "date")

  val tsDF = df.withColumn("ts", to_timestamp($"date"))

  val result = tsDF .
    select($"trackerno", $"date").
    where($"ts" >= to_timestamp(lit("2019-03-01 17:44:59")) &&
      $"ts" <= to_timestamp(lit("2019-03-01 17:59:59")))

  result.show(false)

【讨论】:

【参考方案2】:

您的问题不太清楚,特别是您将如何测量 15 分钟的窗口开始和结束时间。我只是根据我的一点理解来回答。

创建一个 15 分钟时间范围的窗口

from pyspark.sql.functions import window
grouped_window = df.groupBy(window("adate", "15 minutes"),"trackerno","adate").count()

这会给你带来这样的结果。

+------------------------------------------+---------+-------------------+-----+
|window                                    |trackerno|adate              |count|
+------------------------------------------+---------+-------------------+-----+
|[2019-03-01 17:45:00, 2019-03-01 18:00:00]|53451324 |2019-03-01 17:50:00|1    |
|[2019-03-01 18:30:00, 2019-03-01 18:45:00]|54002797 |2019-03-01 18:30:00|1    |
|[2019-03-01 17:45:00, 2019-03-01 18:00:00]|53471705 |2019-03-01 17:59:00|1    |
|[2019-03-01 18:00:00, 2019-03-01 18:15:00]|54046022 |2019-03-01 18:00:00|1    |
|[2019-03-01 17:45:00, 2019-03-01 18:00:00]|54030173 |2019-03-01 17:45:00|1    |
+------------------------------------------+---------+-------------------+-----+

from pyspark.sql import functions as f
from pyspark.sql import Window
w = Window.partitionBy('window')

grouped_window.select('adate', 'trackerno', f.count('count').over(w).alias('dupeCount')).sort('adate')\
    .where('dupeCount > 1')\
    .drop('dupeCount')\
    .show()

+-------------------+---------+
|              adate|trackerno|
+-------------------+---------+
|2019-03-01 17:45:00| 54030173|
|2019-03-01 17:50:00| 53451324|
|2019-03-01 17:59:00| 53471705|
+-------------------+---------+

【讨论】:

【参考方案3】:
df.where(minute($"ts")>=45)

【讨论】:

以上是关于如何在火花中创建特定的时间范围的主要内容,如果未能解决你的问题,请参考以下文章

如何从 .wav 文件中提取特定频率范围?

根据日期范围过滤火花数据框[重复]

如果范围中的单元格包含特定文本/字符,如何连接列标题

当时间范围在两天之间时如何获取特定时间范围内的记录

如何在 Pandas 中选择行范围?

ORACLE SQL - 如何检查时间是不是在特定范围内?