在过去十年中,机器学习的发展和成功是惊人的,这主要是由海量数据的可用性和先进的计算能力推动的。这种激增是由各个部门的数字化带来的,导致数字数据的爆炸式增长——从社交媒体帖子到在线交易和传感器数据的一切。
机器学习技术,特别是深度学习技术的进步,促进了更复杂和通用模型的开发。因此,机器学习应用程序变得无处不在,有助于提高包括医疗保健、金融和交通在内的众多部门的效率和能力。
使用这些大量基于事件的数据并及时从事件本身及其上下文(附近发生的其他事件)中获取价值仍然很困难。以实时或流媒体方式这样做更难。您通常必须使用复杂的低级 API,或者绕过旨在解决非常不同的问题(如 SQL)的高级查询语言的局限性。
为了应对这些挑战,我们引入了一种新的基于时间的数据抽象,称为时间线。时间线按时间和实体组织数据,为基于事件的数据提供理想的结构和直观的图形化心智模型。时间轴通过将您的心智模型与问题域对齐来简化关于时间的推理,使您能够专注于计算什么,而不是如何表达它。
在这篇文章中,我们将时间线作为一种自然方式来组织基于事件的数据和提取价值——直接,并作为机器学习和提示工程的输入。我们深入研究时间线概念、它与外部数据存储(输入和输出)的交互,以及使用时间线的查询的生命周期。
这篇文章是关于Kaskada 的系列文章中的第一篇文章,Kaskada 是一个围绕时间轴抽象设计的开源事件处理引擎。接下来,我们将解释 Kaskada 如何在时间线抽象上构建富有表现力的时间查询语言,时间线数据模型如何使 Kaskada 能够有效地执行时间查询,最后,时间线如何使 Kaskada 能够在事件流上增量执行。
当将每种事件视为一个单独的、无序的数据表时,处理大量不同的事件是很困难的——SQL 看待世界的方式。很难理解是什么促使 Carla 进行购买,或者是什么导致 Aaron 通过消息与其他用户互动。
通过按时间和用户组织数据,发现模式变得更加容易。阿龙赢了之后发消息。卡拉因一连串的损失而感到沮丧,于是开始购买。我们还看到布拉德可能已经停止比赛了。
通过按时间和用户组织数据,发现模式变得更加容易。阿龙赢了之后发信息。卡拉因一连串的损失而感到沮丧,于是开始购买。我们还看到 Brad 可能已经停止演奏了。
通过以自然的方式(按时间和用户)组织事件,我们能够识别模式。同样的组织允许我们表达从事件计算的特征值,并使用这些值来训练和应用机器学习模型或计算值以在提示中使用。
关于时间的推理——例如,事件之间的因果关系——需要的不仅仅是一组无序的事件数据。对于时间查询,我们需要将时间作为抽象的第一类部分。这允许推理事件发生的时间以及事件之间的顺序和时间。
Kaskada 建立在时间轴抽象之上:按时间排序并按实体分组的多重集。时间轴具有自然的可视化效果,如下所示。时间显示在 x 轴上,相应的值显示在 y 轴上。考虑两个人的购买事件:Ben 和 Davor。这些显示为反映购买时间和金额的离散点。我们称这些离散的时间线是因为它们代表离散的点。
时间线的时间轴反映了计算结果的时间。例如,在任何时候我们可能会问“所有购买的总和是多少?”时间线上的聚合是累积的——随着事件的观察,问题的答案也会发生变化。我们称这些为连续时间线,因为每个值都会持续到下一次更改。
与 SQL 相比,时间线引入了两个需求:按时间排序和按实体分组。虽然 SQL 关系——无序多重集或包——对无序数据很有用,但时间线的额外要求使它们成为推理因果关系的理想选择。时间线之于时间数据就像关系之于静态数据。
添加这些要求意味着时间表并不适合所有数据处理任务。相反,它们允许时间线更适合处理事件和时间的数据处理任务。事实上,大多数事件流(例如 Apache Kafka、Apache Pulsar、AWS Kinesis 等)都提供按键排序和分区。
在考虑事件和时间时,您可能已经想到了时间轴之类的东西。通过匹配您对时间的思考方式,时间线简化了对事件和时间的推理。通过建立时间和顺序要求,时间线抽象允许时间查询直观地表达因果关系。
时间线是 Kaskada 中用于构建时间查询的抽象,但数据在 Kaskada 之外开始和结束。了解从输入到时间线,最后到输出的数据流很重要。
每个查询都从一个或多个输入数据源开始。每个输入——无论是到达流中或存储在表中的事件,还是存储在表中的事实——都可以转换为时间线,而不会丢失重要的上下文,例如每个事件的时间。
查询本身表示为一系列操作。每个操作都从时间线创建时间线。最终操作的结果用作查询的结果。因此,查询会生成一个时间线,该时间线可以是离散的也可以是连续的。
查询的结果是一个时间线,它可以输出到一个接收器。写入接收器的行可能是反映时间线内变化的历史记录,也可能是反映特定时间点值的快照。
在执行查询之前,每个输入都映射到时间轴。每个输入——无论是来自流或表的事件还是表中的事实——都可以映射到时间线,而不会丢失重要的时间信息,例如事件发生的时间。事件成为离散的时间线,每个事件的值都在事件发生时发生。事实成为连续的时间线,反映了每个事实适用的时间。通过无损地表示各种时间输入,时间线允许查询专注于计算而不是输入的种类。
执行查询后,生成的时间线必须输出到外部系统以供使用。每个目的地的接收器都可以配置数据写入,具体取决于接收器和目的地(请参阅
有几个选项可以将时间线转换为数据行,影响生成的行数:
完整的变化历史有助于可视化或识别用户价值观随时间变化的模式。相反,特定时间的快照对于在线仪表板或对相似用户进行分类很有用。
当目的地已经有截至该时间的数据或较早的点不相关时,在特定时间之后包括事件会减少输出大小。这在重新运行查询以具体化到数据存储时特别有用。
包括特定时间之前的事件也会限制输出大小并支持选择时间点快照。通过增量执行,选择比当前时间稍早的时间可以减少延迟数据处理。
“changed since”和“up-to”选项对于增量执行特别有用,我们将在下一篇文章中讨论。
当您关心过去的点时,历史记录(时间轴中所有点的集合)非常有用。例如,这可能是可视化或识别每个用户的值如何随时间变化的模式所必需的。历史对于输出训练示例以用于创建模型特别有用。
任何时间线都可以作为历史输出。对于离散时间线,历史是时间线中事件的集合。对于连续的时间线,历史记录包含值发生变化的点——它实际上是一个变更日志。
当您只关心最新值时,快照(每个实体在特定时间点的值)很有用。例如,在更新仪表板或填充特征存储以连接到模型服务时。
任何时间线都可以作为快照输出。对于离散时间线,快照包括当时发生的每个事件的行。对于连续的时间线,快照包括每个实体的一行以及该实体当时的值。
这篇博文强调了从基于事件的数据创建 ML 模型时时间特征的重要性。事件的时间和时间背景对于查看活动模式至关重要。这篇文章介绍了时间线抽象,这使得处理事件和时间上下文成为可能。时间轴按时间和实体组织数据,与多重集相比,为基于事件的数据提供更合适的结构。
时间线抽象是流处理中的自然进展,使您可以更有效地推理时间和因果关系。我们还探讨了时间查询中的数据流,从输入到输出,并讨论了将时间线输出到外部系统的各种选项。
Kaskada 不是对一系列快照应用表格(静态)查询,而是对历史(更改流)进行操作。这使得对快照之间的时间进行操作变得很自然,而不仅仅是对快照中包含的数据进行操作。使用时间线作为主要抽象简化了基于事件的数据的处理,并允许在流和表之间进行无缝转换。
你可以
作者:Ben Chambers 和 Therapon Skoteiniotis,DataStax