如何通过时间戳属性过滤对象数组(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()' 函数。
所以我正在为在 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()' 函数。