数据需要被接收到系统中并写入存储,以便进一步处理。在这个阶段,必定会对数据进行过滤和选择。不是所有创建的数据都被提取或收集,因为可能其中某些数据我们不想要或不需要。
在这个阶段,我们可以按不同类型过滤数据(我们认为对模型没用的数据的字段或元素)。如果我们有太多的数据以至于我们没有信心能负担得起所有的数据处理,也可以在这个阶段简单地抽样,因为机器学习训练和其他数据处理的计算通常是非常昂贵的。对数据进行抽样可以有效地节省中间处理和训练的成本,但其中重要的是,要在抽样导致的质量下降与所节省的成本之间进行权衡。数据的抽样也应该与每个时间段或我们关心的数据中的每个其他切片的数量/速率成正比。这将避免在突发期错过细节。然而,抽样偶尔会丢失一些事件的细节,这是不可避免的。
通常来说,数据越多,机器学习训练系统表现越好。虽然学究们会立即想到许多例外情况,但这是一个有用的出发点。因此,在降低成本的同时,任何数据的减少都可能对其质量产生影响。
根据数据量和服务的复杂性,提取阶段可能是简单的“在不同目录中转存一些文件”,或者是复杂的远程过程调用(RPC)端点,接收特定格式的文件,并确认已收到相应的数据包,以便可以通过系统跟踪其进展。在大多数情况下,我们希望至少有一个简单的API可以用于数据提取,因为这提供了一个明显的位置来确认数据的接收与存储,记录提取情况,并使用关于数据的任何治理策略。
提取阶段的可靠性问题通常集中在数据的正确性和吞吐量上。 正确性 是一个通用属性,指数据被正确地读取和写入正确的位置而不会被跳过或放错位置。虽然数据放错位置的想法听起来很有趣,但它确实会发生,而且很容易看到它是如何发生的。存储中以日期或时间为导向的分桶系统,再加上摄取过程中的偏差,可能会导致每天的数据都存储在前一天的目录中。在提取前和提取过程中监控数据是否存在及其存储状况是数据管道中最困难的部分。