APP下载

基于MapReduce微博数据清洗的研究与实现

2021-12-09王国珺

信息记录材料 2021年11期
关键词:键值标签解析

王国珺,林 峰

(福州职业技术学院 福建 福州 350000)

1 引言

采用任何方式抓取到的微博评论数据通常比较乱,其中有一些无用信息,而我们的目标是只提取其中的中文文字内容,因此抓取的数据在分析之前,必须进行清洗。数据清洗分为3个步骤,即抽取、转换、加载。当数据量增大时,传统的清洗技术已无法满足企业之间的技术支持,所以本文结合MapReduce分而治之的思想设计出分布式数据清洗系统[1]。

2 微博数据的理解

微博数据首先是以半结构化XML格式存储的,每个评论版块内容用标签标识,在该对标签内部标签对记录该版块的主题名称,例如topic1,标签对记录该主题评论的具体内容,其中每对标签代表一个完整的评论。有多少对,就代表该主题下有多少条评论。提取微博的存储数据格式,核心结构如下所示[2]。

再看中间的具体内容结构,存储格式如下:

其中每对标签中对应的属性名个数并不一致,属性值用双引号(””)进行标识,属性值内容中也出现双引号内容时,用转义符号" "替代。如下面两行数据的举例中,有的属性值中有Score(评分)项,有的记录中没有。

3 微博数据清洗业务

微博数据统计分析中,对于某类评论内容较多,每天或每天中某时主题帖子评论的数量及长度,或哪些用户较活跃等,这些都需要将数据从XML存储的格式中提取出来,例如哪些内容是哪个主题的,每一条评论内容中指定属性值的提取等。该微博数据的结构决定了数据清洗大体是分两种情况。

情况1:针对XML标签进行主题清洗。

将不同主题数据以不同目录的形式生成,针对每个目录下存储相应主题的评论内容,即每对标签对应内容为同一个主题,清洗出comments标签下对应属性值(当前主题名称),并将该标签对应的所有评论内容一条(每对标签内容对应一行)一行地存储在该文件夹下。

情况2:针对<属性名1=”属性值1”>键值对数据的清洗。

获取内容指定属性值,例如获取Text(评论内容)或CreationDate(评论时间)的值。由于标签是成对出现,每个值用双引号进行标签,我们可以试着应用Map集合的方法进行提取。

4 微博数据清洗过程的实现

为了实现该微博存储结构数据清洗的目的,首先需要当前运行的Hadoop的分片API查询,看是否存储已有的功能接口可以实现我们的需求。本案例借助对系统要求较低的Eclipse免费工具进行编写,具体实现过程主要分3个大任务[3]。

任务1:Eclipse下建立项目并准备实验数据。

主要完成项目编程过程的前期准备工作,主要分两步完成:第1步:Eclipse下项目建立。例如建立一个名这BlogsCleanMRProject的项目。

第2步:实验数据准备。可将数据暂时放入当前项目的根目录下。

任务2:编写MapReduce程序实现XML数据清洗。

第1步:自定义分片的编写。

主要完成自定义RecordReader类(命名为XMLRecord Reader.java)和自定义InputFormat类(命名为XMLInput Format.java)的创建。Src下出现了设置的包名,包名下多出新建立的类文件XMLRecordReader.java,并且该文件在Eclipse工具中央窗口位置打开,可以在此进行代码的编辑,见图1。

图1 编程窗口

编写XMLRecordReader类文件程序,部分参考代码如下。

第2步:编写Mapper类实现XML指定标签内容读取与数据分箱。

(1)选中项目下包名com.apache.hadoop.mr.split,鼠标右键,依次选择New->class选项,在弹出的New Java Class窗口中配置包名和类文件名XMLMapper,单击Finish按钮。见图2。

图2 配置XMLMapper

(2)在新建立的XMLInputFormat类文件中编写程序,参考代码如下。

任务3:编写MapReduce程序实现评论内容属性值的解析。

任务2中实现了Mapper中map方法读取的是一条一条的对应的值,即每一条评论的内容,这些内容是以<属性名1=”属性值1”,属性名2=”属性值2”,……,属性名n=”属性值n”>成对的方式出现的,每条数据量在本地Hadoop集群的节点中的Mapper进程中运行是绰绰有余的,故只需要编写一个解析<属性名1=”属性值1”>对的方法即可。由于中值的属性对个数并不统一,例如有的有Score评分项,有的没有,所以可将解析出来的内容以键值对的方式存储入集合中,供程序调用即可,故本任务实现过程主要分3步[4]。

第1步:编写解析每条评论内容的类文件,例如MRUtils.java。即将中值中每对属性的解析出来,以键值对的方式存储入集合中。

第2步:编写Mapper类读取评论中指定属性Text和CreationDate的值。在任务2的基础上在Mapper类中调用,并通过MRUtils类解析中值中每对属性值,做这map的K-V传入上下文中。

第3步:编写Job类运行MapReduce程序。在当前Eclipse工具的Hadoop环境下运行编写好的MapReduce程序,并观察运行过程,查看运行结果,验证程序正确执行。

5 结论

案例主要完成Eclipse工具下编写MapReduce程序实现微博数据的清洗工作。整个程序编写的过程中并不需要开启Hadoop环境,好处是节省系统资源,使程序编写调试过程更加流畅。实际应用时,可将写好的程序打成Jar包,启动Hadoop平台后,在Hadoop平台上运行。

猜你喜欢

键值标签解析
三角函数解析式中ω的几种求法
非请勿进 为注册表的重要键值上把“锁”
无惧标签 Alfa Romeo Giulia 200HP
不害怕撕掉标签的人,都活出了真正的漂亮
睡梦解析仪
电竞初解析
一键直达 Windows 10注册表编辑高招
对称巧用解析妙解
标签化伤害了谁
科学家的标签