基于kettle的车机大数据清洗方案
2022-07-18唐文笙张亮程登温丽梅
唐文笙,张亮,程登,温丽梅
(上汽通用五菱汽车股份有限公司 广西汽车新四化重点实验室,广西柳州,545007)
0 引言
近年来,大数据技术掀起了计算机领域的一个新的浪潮,无论是数据挖掘、数据分析、数据可视化,还是机器学习、人工智能,它们都绕不开“数据”这个主题,从新兴产业到传统行业,从统计学家到软件开发人员,越来越多的人对数据科学产生了兴趣,廉价的硬件、可靠的数据处理工具以及海量的数据这些资源使得我们可以轻松地、精确地发现趋势、预测未来。
而同时,对于传统汽车行业,近几年由内而外的智能化转型,让智能汽车逐步成为了新一代汽车消费者的首选,而智能汽车各个零部件所产生的海量数据,更加有助于汽车厂商们对用户的需求进行定位,从而帮助汽车厂商们快速跟进用户需求,拓宽汽车营销市场。然而,海量数据来源于汽车的各个零部件,每个零部件所上传的数据类型也是多且繁杂的,因此数据中会夹杂着不完整、重复以及错误的数据,如果直接使用这些原始数据,不仅没办法提高数据决策的准确性,反而更容易带偏决策,严重者可能错失用户市场。所以,我们需要对原始数据进行一个数据清洗的相关操作,进而得出可靠的、准确的数据。
ETL就是用来描述将数据从源端经过抽取、转换、加载至目的端的过程,它能够对各种分布的、异构的源数据进行抽取,按照预先设计好的规则将不完整数据、重复数据以及错误数据等“脏”数据进行清洗,得到符合要求的“干净”数据。
Kettle是一款完全开源的ETL工具,其主要作用是完成数据抽取、转换和加载等数据处理方面的工作。Kettle诞生于2006年,经过十五年的发展完善,kettle现在已经可以全面支持多平台运行,可对接包括传统数据库、文件、大数据平台、接口、流数据等数据源,支持ETL数据管道加入机器学习算法。同时,kettle提供了简单明了的图形操作界面,它的流程式设计也十分地便捷。
1 Kettle的转换和作业
Kettle的控件包含两个部分,即转换(Transform)和作业(Job)。
转换是ETL中最主要的部分,它处理抽取、转换、加载各个阶段各种对数据行的操作。转换包括一个或多个步骤,如读取文件、过滤输出行、数据清洗或者将数据加载到数据库。
转换里的步骤通过跳来连接,跳定义了一个单向通道,允许数据从一个步骤向另一个步骤流动。在Kettle中,数据的单位就是行,数据流就是数据行从一个步骤到另一个步骤的移动过程。
转换的跳,就是步骤之间带箭头的连线,跳定义了步骤之间的数据通路。跳实际上是两个步骤之间的行集缓存,当行集满了,则向行集写入数据的步骤将停止写入,直到行集又有了空间,当行集空了,从行集读取数据的步骤将停止读取,直到行集又有了可读取的数据行。跳基于这种行集缓存的规则允许每个步骤都由一个独立的线程运行,这样的并发程度最高;同时这一规则也允许数据以最小消耗内存的数据流的方式来处理。当转换启动后,所有步骤都同时启动,从它们的输入跳中读取数据,并把处理过的数据写入到输出跳,直到输出跳中不再有数据,就中止步骤的运行,当所有的步骤都中止了,整个转换就中止了。
Kettle中提供了许多单一组件用以实现转换,每个转换由一个或者多个步骤组成,每个步骤通常包含一个组件,每个组件都有其单一作用,一个完整的转换可以作为作业的一个步骤而存在,转换是kettle开发的基础,而其中的组件是转换的基础,下文会详细介绍常用组件的作用。
作业由一个或者多个作业项组成,这些作业项按照某种顺序来执行,形成一个工作流;作业执行顺序有作业项之间的跳和每个作业执行结果来决定。作业中每一个作业项,都必须等到前面的步骤执行完毕,后面的步骤才会执行,如此等待全部步骤完成后就完成了此作业。
作业是按照顺序执行作业项,所以必须定义一个起点,从而有了一个“开始”的作业项,一个作业只能定义一个“开始”作业项。同时,Kettle使用了一种回溯算法来执行作业里的所有作业项,而且作业项的云心结果(真或假)也决定执行路径。这种回溯算法就是:假设执行到了图里的一条路径的某个节点时,要依次执行这个节点的所有子路径,直到没有再可以执行的子路径,就返回该节点的上一个节点。这种回溯算法有两个重要特征:1.当在作业中创建了一个循环时,一个作业项就会被执行多次,作业项的多次运行结果会保存在内存中,后续作业项可以使用。2.如果不对作业项定义执行顺序的话,那么该作业会存在多次运行结果,这种情景对于作业的嵌套很不友好,不确定的因素会直接影响后续作业的执行结果,进而影响到整个作业流程的结果。
2 Kettle关键组件
Kettle本身是一个可视化的ETL工具,下面从几个点介绍Kettle的关键组件:
(1)数据准备
Kettle提供了多种数据库连接方式,其中包括JDBC、ODBC和JNDI连接,一般情况下,常用的连接方式是JDBC和JNDI,这两种方式与Kettle本身开发源码十分契合。值得注意的是,配置好数据源,做好数据准备之后,可以将其配置共享为全局的数据源,这样就可以在所有的转换中共用一个数据,避免冗余接入的麻烦。
(2)数据抽取
Kettle提供多种数据抽取方式,其中包括XML输入、EXCEL输入、JSON输入、CSV输入、表输入等,前三种输入方式为文件输入方式,可直接读取指定文件内数据,表输入为数据库输入,通过查询语句来提取到数据库表中数据。
(3)数据转换
Kettle中不提供单一的数据转换步骤,有许多的组件组合成为一个完整的数据转换功能。下面就一些常用的组件进行介绍:
排序记录:顾名思义,就是对数据流进行排序,Kettle中许多组件的前置步骤就需要进行排序;
去除重复记录:此组件的作用就是去除重复的数据记录,如果存在两条重复的记录,则会删除第二条数据;
数值范围:此组件的作用对指定的字段进行限制,将其限制在指定的数值范围内;
拆分字段:此组件的作用是将一个字段的内容按照指定规则拆分;
替换NULL值:此组件的作用是将NULL值替换成指定的内容;
值映射:此组件的作用是将字段内容映射成指定的内容;
此外,Kettle还提供其他的组件功能,各个转换功能都十分强大。
(4)数据装载
完成数据准备、抽取以及转换后,就需要将数据装载输出,Kettle提供多种数据装载组件,其中有表输出、插入/更新、EXCEL输出、文本文件输出等。表输出和插入/更新是输出至数据库表,而EXCEL输出和文本文件输出是输出成文件形式,其中插入/更新是按照指定的字段进行插入/更新操作,而表输出、EXCEL输出、文本文件输出则是全量输出。
(5)查询连接
实际Kettle应用有许多需要连表查询的操作,将两个数据库通过指定关键字连接,并查询数据结果,此时就可以用到记录集连接、记录关联以及流查询了,其中:流查询主要用来查询数据源里的数据并合并到主数据流中,记录集连接则是通过关键字进行连接,实现SQL语句中左右连接以及内外连接的效果,记录关联则是实现笛卡尔积的一个步骤组件。
3 数据清洗方案
对于数据及时性有较高要求的业务场景中,比如智能网联汽车车机产生的行驶数据,每时每刻都会有许许多多的车辆上传数据报文,每天的数据内容巨大,而且其内容参差不齐,这就要求我们有一个完整的数据清洗规则,对于车机上传的脏数据进行清洗,进而获得高质量的车机行驶数据。以下将会通过一个实际案例来讲解数据清洗方案。
(1)数据准备
首先准备一个车机数据表t_car,该表由ID、VIN、驾驶里程、驾驶时长、平均速度、最高速度组成,该表为一天多台车的驾驶数据统计结果,不应当存在一天多条记录的现象,具体数据表如表1所示。
表1 车机数据表
(2)去除重复数据
Kettle中提供了去除重复记录组件以实现去除重复记录的效果,使用此组件前需要对数据进行排序,因此,完整的步骤应该是:输入→排序记录→去除重复记录→输出;表输入为读取车机数据表t_car数据,排序记录按照VIN进行排序,并按照VIN进行去除重复记录,最终数据流流入下一步。
(3)数据校验
数据经过去重处理后,去除了重复的LK1545记录,可以看见数据还是存在脏数据:最高车速为278km/h 以及 最高车速错乱,故而还需要对每个数据项进行进行数据校验。对于此类数值类数据,可以使用数值范围来进行数据校验,对每个字段进行数值约束:最高车速字段的最小值定义为0,最大值定义为150,同样,对平均车速加以同样的约束。
(4)数据输出
数据输出使用表输出来实现数据输出,将经过了前面步骤的数据输出到指定的数据表,即可完成数据清洗的过程。整体转换流程如图1所示。
图1 Kettle实现流程图
最终的数据清洗效果数据表如表2所示。
表2 清洗完成数据表
可以看到,重复VIN的数据已被清洗掉,同时车速异常的数据也被上文定义的规则清洗掉,得到了质量更高的数据内容。
(5)任务部署
此前的1、2、3、4步骤已完成了数据清洗转换的过程,现在需要将此转换部署成定时任务的形式。将此转换封装成作业,设置定时,每天的早上7点30分启动作业,同时设置失败邮件警告,选择发送邮件组件,设置收件人、发件人及邮件服务器,当作业失败时发送邮件给接收人,可以达到监控作业的目的,方便对应人员及时处理作业过程中发生的异常;完成相关设置后,点击启动,Kettle会保留一个进程在后台,每天7点30分启动作业,作业失败时会有邮件通知,作业成功时无其他操作,即完成了任务部署。
4 总结
在数据爆发式增长的时代,数据挖掘的价值日益可见,数据清洗已经成为大数据挖掘项目中必不可少的准备步骤。数据的质量也是会直接影响数据分析的结果,数据清洗方案中包含的步骤有很多,例如缺值的处理、去除重复记录和数据的校验等等。本文通过Kettle工具提供的组件功能,构建了一个车机大数据清洗流程,实现了对车机大数据的清洗目标。
未来将不断完善数据转换清洗的过程,提高数据质量,优化ETL设计流程,提升数据更新效率,为企业进一步的商业智能分析、OLAP分析以及知识发现奠定数据基础。