基于SparkStreaming的实时数据清洗
数据清洗, 是整个数据分析过程中不可缺少的一个环节,其结果质量直接关系到模型效果和最终结论。在实际操作中,数据清洗通常会占据分析过程的50%—80%的时间。国外有些学术机构会专门研究如何做数据清洗,相关的书籍也不少。本文的背景是netflow数据流的实时清洗,相比于离线的数据清洗,实时数据清洗更倾向于数据的缺值过滤和数据合法性检查以及对性能的苛求。离线数据清洗,则可以通过牺牲性能的方式借助复杂的处理,对数据进行更加细粒度的清洗。对于实时数据清洗的流程我把它分为三步。
一.数据清洗的流程
第一:数据预处理
1.1 数据查看:数据查看可以大致分为两方面。一是查看数据的元数据信息,包括数据来源,字段解释,字段的逻辑关系。二是从数据源抽取一部分数据,人工查看,加深对数据的了解,发现问题,为后续的数据清洗做准备。
1.2 选取处理工具:鉴于数据实时传输,处理工具选择kafka与SparkStreaming。
第二:删除或填充缺失数据
2.1 确定缺失值范围:根据数据的重要程度以及数据的缺失程度评估缺失分数,然后按照缺失比例和字段重要性,分别制定策略。
2.2 去除不需要的数据:这一步主要是为了减少数据的冗余。建议做好数据备份,避免后面的业务逻辑需要用到某些字段。或者先在少量数据上试验成功之后再对全量数据进行处理。
2.3 填充缺失内容:某些没有的数据值需要进行填充,避免后续程序在对数据进行分析时出现空值错误。数据填充方法大概分为三种:
a)以业务知识或经验推测填充缺失值
b)以同一指标的计算结果(均值、中位数、众数等)填充缺失值
c)以不同指标的计算结果填充缺失值
前两种方法比较好理解。关于第三种方法,举个最简单的例子:年龄字段缺失,但是有屏蔽后六位的身份证号,从中提取需要的信息。
第三:数据内容检测
3.1 数据合法性检测:检测各字段是否与指定内容相符,主要是数值,日期等格式。
3.2 数据业务逻辑检测:这一部分则是判断数据是否符合逻辑,如:人的年龄一般都在0-120之间。如果有出现200岁的年龄则判断该条数据时异常数据。
二.实时数据清洗实战
1.设计思路
我司的实时大数据处理的架构是flume+kafka+sparkstreaming+mysql/hive/hdfs/hbase。数据通过flume收集起来,通过kafka来做缓存和容灾,最后由SparkStreaming来做实时处理。为了使数据清洗从代码中独立