如何通过时间戳属性过滤对象数组(SQL 的替代代码通过 - 命令滞后于分区)

How to filter array of objects by timestamp attribute (code alternative to SQL lag over partition by - command)

所以我正在为在 java 虚拟机上执行的 apache spark 编写代码。它有 Spark SQL 允许用户在对象集合上编写 SQL 表达式。

SQL 我试图查询的命令对于 spark 的引擎来说太复杂了,所以我试图使用不是 SQL.

的代码找到替代方法

我正在编写一个脚本来检查我的数据流是否每 12 小时流式传输一次

示例数据如下所示:

sourceId          streamedAt
----------------------------------
station_1      2019-06-02 09:01:10
station_1      2019-06-02 09:01:13
station_1      2019-06-02 21:05:10
station_1      2019-06-02 21:08:15
station_2      2019-06-02 09:30:10
station_2      2019-06-02 09:31:10
station_2      2019-06-02 21:40:11
station_2      2019-06-02 21:40:12

您可以将其视为一个 StreamerEvent 对象数组:

class StreamerEvent {
    String sourceId;
    Date streamedAt;
}

我需要搜索整个集合,并为每个持续几分钟的流媒体和流(每 12 小时 +- 某个时间发生一次)只获取特定流媒体间隔中的第一个。所以我的数组现在看起来像这样:

sourceId          streamedAt
----------------------------------
station_1      2019-06-02 09:01:10
station_1      2019-06-02 21:05:10
station_2      2019-06-02 09:30:10
station_2      2019-06-02 21:40:11

所以我的 SQL 查询是:

spark.sql("SELECT * FROM (select sourceId, streamedAt, lag(streamedAt, 1) over(partition by sourceId order by streamedAt) as prev_streamedAt from streaming_data) streaming_data where prev_streamedAt is null or prev_streamedAt < streamedAt - interval 11 hour")

但它不适用于流数据,仅适用于静态数据。

有人可以就如何使用 java/scala 集合给出一些提示吗?

好的。所以我找到了解决这个问题的方法。

我只需要将时间戳列的时间部分四舍五入如下:

2019-06-02 09:01:10 => 2019-06-02 09:00:00

为此,我在 scala 中使用了 org.joda.time 库。

在那之后,我只是习惯于select 区分两列。

同样在 spark 中,更好的解决方案是在给定数据帧上使用 'dropduplicates()' 函数。