【问题标题】:Group Cassandra entries by nearby timestamp按附近的时间戳对 Cassandra 条目进行分组
【发布时间】:2015-12-18 18:33:27
【问题描述】:

我有这张 Cassandra 表:

CREATE TABLE events(
    userId uuid,
    datetime timestamp,
    id uuid,
    event text,
    PRIMARY KEY (userId, datetime, id)
);

我想做的是对特定用户同时发生的事件进行分组。因此,例如,如果某个用户的事件发生在:

9:00:11 AM
9:00:13 AM
9:00:16 AM

9:03:55 AM
9:03:58 AM
9:04:03 AM

9:15:35 AM
9:15:38 AM

我想要3组:

1: 9:00:11 AM to 9:00:16 AM
2: 9:03:55 AM to 9:04:03 AM
3: 9:15:35 AM to 9:15:38 AM

我希望机器学习算法如 DBSCAN 可以弄清楚应该如何进行聚类,但是将它们之间的间隔不到一分钟的事件分组可能就足够了。

如果我能得到每个组的开始和结束时间的置信区间,则可以加分。

我研究过使用基本 CQL,如 group by、Apache Spark 的 groupByKey 和 MLib Clustering,但没有任何成功。理想情况下,将使用 Apache Spark Streaming 近乎实时地处理结果。

这是一个新建项目,因此 Cassandra 和 Spark 不是必须的。我也考虑过使用 Storm。

【问题讨论】:

  • 大约在同一时间 不是一个好的规范,也绝对不是我们可以转换为代码的东西。对于初学者来说,窗口大小是否有限制?如果是这样,组重叠会发生什么。或者可能只是连续事件之间的差异?
  • 你是对的,这不是一个明确的规范。我希望机器学习算法可以弄清楚应该如何进行聚类。但是,对它们之间间隔不到一分钟的事件进行分组可能就足够了。感谢您的反馈。
  • 如果您更改架构,您可以创建任意存储桶作为集群键(时间戳之前/左侧),并将其用于分组。

标签: apache-spark cassandra apache-storm


【解决方案1】:

您似乎在谈论会话窗口。现在我只知道 Google Dataflow 为您提供系统支持。如果您使用 Storm,则需要手动编写会话逻辑代码。

无论如何,如果您使用的是流式传输系统,您首先需要根据时间戳对数据进行排序,然后按时间戳升序将它们流式传输到系统中。

Apache Flink 可能会为您提供比 Storm 更多的支持来编写此代码,但这也需要手动操作。即使 Flink 比 Storm 更接近 Google Dataflow(Flink 也可能在不久的将来添加会话窗口)。

顺便说一句:您提到的 groupBy / keyBy 语句适用于按用户 ID 对数据进行分区,但不适用于构建窗口。

【讨论】:

  • 是的,会话窗口是我想要做的。很高兴有一个术语! Google Dataflow 看起来不错,但开源替代品会更好。正如你所提到的,很难找到。谢谢!
  • 在开源领域,我猜 Apache Flink 应该给你最好的开始做会话窗口。
  • 这里是数据流工程师。请注意,Dataflow 也要求数据按时间戳进行预排序 - 它的语义主要定义在事件时间(事件发生时),而不是处理时间(处理时) ,为了支持现实的乱序流、回填等。我相信 Flink 要么正在迅速努力支持 Dataflow 的窗口语义,要么最近才实现它——所以如果你正在寻找一个开源的替代方案,那就是你应该在哪里看。 Spark 流式传输和 Storm 距离提供类似的语义还有很长的路要走。
猜你喜欢
  • 2011-11-28
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 2021-12-09
  • 2019-03-27
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
相关资源
最近更新 更多