这是我参与「第四届青训营 」笔记创作活动的的第6天
什么是流数据操作
流数据操作应该说是流计算系统与生俱来的能力,它是针对数据流的“转化”或“转移”处理。流数据操作的内容主要包括四类。
-
一是流数据的清洗、规整和结构化。比如提取感兴趣字段、统一数据格式、过滤不合条件事件。
-
二是流数据的关联及合并。比如在广告转化率分析中,将“点击”事件流和“安装”事件流关联起来。
-
三是流数据的分发和并行处理。比如将一个包含了来自不同设备事件的数据流,按照设备id分发到不同的流中进行处理。
-
四是流数据的转移和存储。比如将数据从 Kafka 转移到数据库里。
虽然不同系统实现以上四类流数据操作的具体方法不尽相同,但经过多年的实践和经验积累,业界针对流数据操作的目标和手段都有了一定的共识,并已逐步形成一套通用的 API 集合,几乎所有的流计算平台都会提供这些 API 的实现。比如:
-
针对流数据的清洗、规整和结构化,抽象出 filter、map、flatMap、reduce 等方法;
-
针对流数据的关联及合并,抽象出 join、union 等方法;
-
针对流数据的分发和并行处理,抽象出 keyBy 或 groupBy 等方法;
-
针对流数据的转移和存储,则抽象出 foreach 等方法。
这些 API 的功能各不相同,但它们在一起共同构成了一个灵活操作流数据的方法集合。
过滤 filter
首先是过滤 filter 。“过滤”就是在数据流上筛选出符合条件的数据。这个方法通常用于剔除流数据中你不想要的数据,比如不合预期的事件类型、不完整的数据记录等。比如可以用这个方法来对流数据进行采样,比如只保留 1/10 的流数据,从而减少需要处理的数据量。
下面举一个具体的例子来讲下如何使用 filter 方法。比如,我们现在需要监控仓库的环境温度,在火灾发生前提前预警以避免火灾,那么我们就可以采用过滤功能,从来自于传感器的环境温度事件流中,过滤出温度高于 100 摄氏度的事件。
这里我们使用 Flink 来实现。这里的代码很简单,只需要先了解下这些 API 的使用形式即可。
DataStream<JSONObject> highTemperatureStream = temperatureStream.filter(x -> x.getDouble("temperature") > 100);
后面再继续补充说明。今天先到这吧。