Hadoop综合项目——二手房统计分析(起始篇)

news2024/11/18 22:52:15

Hadoop综合项目——二手房统计分析(起始篇)

文章目录

  • Hadoop综合项目——二手房统计分析(起始篇)
    • 0、 写在前面
    • 1、项目背景与功能
      • 1.1 项目背景
      • 1.2 项目功能
    • 2、数据集和数据预处理
      • 2.1 数据集
      • 2.2 数据预处理
        • 2.2.1 字段空值处理
        • 2.2.2 无用数据的处理
        • 2.2.3 数据重复处理
        • 2.2.4 添加id字段
        • 2.2.5 houseInf字段中的空字符处理
        • 2.2.6 followInfo字段中的空字符处理
        • 2.2.7 title字段中的Tab字符处理
        • 2.2.8 houseInfo字段中的换行符处理
        • 2.2.9 最终数据
    • 3、数据上传
      • 3.1 预处理后的数据上传至HDFS
      • 3.2 数据集展示
    • 4、数据及源代码
    • 5、总结


在这里插入图片描述


0、 写在前面

  • Windos版本:Windows10
  • Linux版本:Ubuntu Kylin 16.04
  • JDK版本:Java8
  • Hadoop版本:Hadoop-2.7.1
  • Hive版本:Hive1.2.2
  • IDE:IDEA 2020.2.3
  • IDE:Pycharm 2021.1.3
  • IDE:Eclipse3.8

1、项目背景与功能

1.1 项目背景

随着经济的发展,北、上、广、深这四大一线城市迅速发展,在经济、政治等方面有突出的表现,而且就业岗位多,生活质量较高,是大多数人所向往的地方。但是定居一线城市并不容易,而购买二手房是一个可以选择的方案,故本项目利用相关二手房信息进行统计分析,进而了解房源基本情况。

1.2 项目功能

统计分析国内四大一线城市二手房的情况,包括房子楼龄、价格、数量、地理位置、优势、面积大小、规格大小等维度,更好地展示二手房的市场趋势,帮助部分人解决购房问题。

2、数据集和数据预处理

2.1 数据集

  • 数据来源:

利用后裔采集器爬取工具,对贝壳找房网站爬取北京、上海、广州、深圳四个一线城市的二手房数据信息。

  • 数据量:11648

tp

  • 数据字段说明:

在这里插入图片描述

  • 原始数据展示:

tp

2.2 数据预处理

数据预处理阶段,本项目是先将爬取的数据直接导入到MySQL
(Windows10环境下),接着通过JDBC的方式连接MySQL数据库,对原始数据进行处理。

2.2.1 字段空值处理

  • 处理目的:

爬取的数据存在字段为空的情况,且均属于整条数据(除城市,标签和爬取时间字段外)的字段都为空的情况,导致数据并不适合分析,也没有分析的意义。因此,直接将此种情况的数据剔除掉

  • 具体处理过程:

处理前:各个城市的空值数据条数如下图所示:

tp

  • 处理结果:

处理后,空值数据为0条,如下图所示:

tp

2.2.2 无用数据的处理

  • 处理目的:

删除没有分析价值的数据,比如下图所示:只有houseInfo、followInfo和total均为空;再比如整条数据都为空的情况。

在这里插入图片描述

在这里插入图片描述

  • 具体处理过程:

直接手动删除掉无用数据

  • 处理结果:

证明无用数据已经删除的方法可以通过下文中的【2.2.3 houseInf字段中的空字符处理】来判断。若截取到的houseInfo中子信息为空,处理houseInf字段中的空字符的程序代码会出现错误,在该程序代码中已经打印出数据处理到哪一个位置,直接根据报错的数据位置,查找对应的无用数据,同时这种数据是个别的,因此在MySQL(Windows10环境下)中将其手动删除即可。

2.2.3 数据重复处理

  • 处理目的:

数据重复会影响对于二手房的统计分析,应当提前将重复数据删除掉。
重复数据如下图所示:

tp

  • 具体处理过程:

使用以下的SQL语句查询重复数据的一组id,最终有38组重复的数据,即有19条数据重复。

with th1 as(
select * from tb_house
), th2 as (
select * from tb_house
)
select th1.id id1, th2.id id2 from th1, th2
where th1.title = th2.title and th1.city = th2.city and th1.houseInfo = th2.houseInfo
and th1.followInfo = th2.followInfo and th1.positionInfo = th2.positionInfo
and th1.total = th2.total and th1.unitPrice = th2.unitPrice and th1.tag = th2.tag
and th1.crawler_time = th2.crawler_time and th1.id != th2.id

对于重复数据,直接使用SQL语句删除即可。

delete from tb_house where id = 10108 or id = 8780 or id = 9900 or id = 10858 or id = 10318 or id = 9899 or id = 8798 or id = 6139 or id = 10528 or id = 9988 or id = 11638 or id = 9898 or id = 8794 or id = 9838 or id = 9808 or id = 11458 or id = 9839 or id = 10529 or id = 11128;
  • 处理结果:

数据不再有重复的情况,可以通过上述查找重复数据的SQL语句再次确认。

2.2.4 添加id字段

  • 处理目的:

作为数据的编号,便于测试分析等。

  • 具体处理过程:

直接在MySQL(Windows10环境下)中执行下面的SQL语句,并将id字段设置为主键且设置为自增模式。

alter table tb_house add id int(6);
  • 处理结果:

处理后,id字段已经添加成功,如下图所示:

tp

2.2.5 houseInf字段中的空字符处理

  • 处理目的:

爬取的数据中houseInfo字段存在空字符的情况,且每条数据均有此种情况,会导致在MapRedude和Hive数据分析时,造成该字段中信息较难处理以及获取对应子字段信息的后果。因此,此处先通过JDBC的方式处理掉该字段中的空字符。

  • 具体处理过程:

处理前,houseInfo字段中的空字符数据展示,如下图所示:

在这里插入图片描述

同时,对于该字段中不存在“建造年份”的信息

tp

通过查询可以得知,一共有1958条数据的houseInfo字段中不存在“建造年份”信息,如下图所示:

tp

对于这种情况,需要为这些数据填充未知的建造年份,此处均采用填充「未透露年份建」的信息,当然也可以使用其他描述信息来填充建造年份,此处考虑到建造年份(如:1992年建)均为6个字符且以「建」字结尾,所以采用了「未透露年份建」来与之相对应填充。
处理完这个情况以及上述的空字符情况之后,需要将该字段以|作为分隔符来分隔houseInfo字段中的各个子信息。即该字段最终的值为「低楼层|共8层|2001年建|3室2厅|104.68平米|东南」。

  • 处理结果:

处理后,houseInf字段有关的建造年份信息已经填充完毕且该字段均没有空字符的存在,如下图所示:

tp

2.2.6 followInfo字段中的空字符处理

  • 处理目的:

爬取的数据中的followInfo字段存在空字符的情况,且每条数据均有此种情况,会导致在MapRedude和Hive数据分析时,造成该字段中信息较难处理以及获取对应子字段信息的后果。因此,此处先通过JDBC的方式处理掉该字段中的空字符。该字段含有的空字符数据如下图所示:

tp

  • 具体处理过程:

处理前,houseInf字段中的空字符数据展示,如下图所示:

tp

同样是通过JDBC的方式,先获取到该字段中的子信息(关注数和发布时间),再通过拼接更新该字段。

  • 处理结果:如下图所示

tp

2.2.7 title字段中的Tab字符处理

  • 处理目的:

对于本项目的MapReduce统计分析阶段,预处理之后的数据是以tab作为每一行数据的分隔符,如若数据的某些字段存在tab字符,那就会影响到MapReduce统计分析中数据字段获取的正确性,从而导致MapReduce的Mapper端数据读取被终止,因此需要提前处理掉这些字段中含有的tab字符。对于本项目数据预处理到当前阶段而言,只有title字段存在这种特殊情况。

  • 具体处理过程:

处理前,title字段中的tab字符数据展示,此种情况如下图所示:

图片

对于此字段的处理,由于这种特殊情况只涉及到id为10931的这一条数据,且title字段的各个子信息(大于1个子信息)之间均以逗号(英文)进行分隔,故可以选择直接在MySQL(Windows10环境下)使用SQL语句直接将tab字符替换成“,”字符,但是此种方式的SQL语句些许麻烦,所以本项目还是采用JDBC的方式进行处理。

  • 处理结果:如下图所示

tp
在这里插入图片描述

2.2.8 houseInfo字段中的换行符处理

  • 处理目的:

由于个别houseInfo字段中存在\n字符,会导致在获取二手房面积大小这一信息时,出现错误的现象,因此需要提前这些回车字符。

  • 具体处理过程:

处理前,houseInfo字段中存在“\n”字符数据展示,此种情况如下图所示:

select id, houseinfo from tb_house where houseinfo like '%\n%'

在这里插入图片描述

对于此字段的处理,由于这种特殊情况只涉及到两条数据,故可以选择直接在MySQL(Windows10环境下)使用SQL语句直接删除掉。

  • 处理结果:如下图所示

说明:在MySQL中,CHAR(10)表示换行符,CHAR(13)表示回车符,很明显,此次预处理就是删除掉换行符。

update tb_house set houseinfo = replace(houseInfo, CHAR(10), '')

图片

再次查询,以确保换行符删除完全

select id from tb_house where houseinfo like '%\n%'

图片

2.2.9 最终数据

在这里插入图片描述

3、数据上传

3.1 预处理后的数据上传至HDFS

zhangsan@node01:~ $ hadoop fs -mkdir /Ke_House
zhangsan@node01:~ $ hadoop fs -put ./tb_house.txt /Ke_House
zhangsan@node01:~ $ hadoop fs -ls /Ke_House
Found 1 items
-rw-r--r--   1 zhangsan supergroup    3385429 2022-11-06 23:48 /Ke_House/tb_house.txt

3.2 数据集展示

最后五条数据

在这里插入图片描述

4、数据及源代码

  • Github

  • Gitee

5、总结

对于本项目,数据字段的处理是最繁琐的,字段处理完毕是统计分析的前提,数据如若杂乱、没有规整性,统计分析将毫无意义。通过MapReduce对最值、排序、TopN、自定义分区排序、二次排序、自定义类、占比等8个方面的统计分析,总体上难度不高;本项目的Hive统计分析案例一共有7个,HQL的正确编写是Hive统计分析的关键,尽管本项目的Hive底层查询引擎使用的MR,但是在正确的基础上编写出高效的查询语句是每一个大数据从业者应该追求的。在数据可视化方面,一共是有8张可视化展示图,通过MR和Hive的统计分析结果以及从MySQL的查询结果,一一展示。本项目是对于Hadoop生态课程学习的成果体现,总体上难度不高,收获较多。

结束!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕设Python+Vue养生知识平台(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

浅析在线教育行业发展所面临的困境

2013年,在线教育行业悄然兴起,一时间引发讨论。到新冠疫情期间,受到疫情和政策的双重抨击,线下教育行业遭到重创,又有更多人开始关注到并开始看好在线教育。作为技术发展下的产物,在线教育跨越了时间、空间…

【小学信息技术教资面试】《认识Windows程序窗口》教案

1.题目:认识Windows程序窗口 2.内容: 3.基本要求: (1)学生掌握改变窗口大小和位置的方法。 (2)教学中注意师生间的交流互动。 (3)让学生明白Windows窗口组成。 《认识W…

超标量处理器设计——第七章_寄存器重命名

超标量处理器设计——第七章_寄存器重命名 参考《超标量处理器》姚永斌著 文章目录超标量处理器设计——第七章_寄存器重命名7.1 简述7.2 寄存器重命名方式7.2.1 用ROB进行寄存器重命名7.2.2 扩展ARF进行寄存器重命名7.2.3 使用统一的PRF进行寄存器重命名7.3 重命名映射表&…

UI 自动化测试实战(二)| 测试数据的数据驱动

关注公众号,获取测试开发实战干货合辑。本文节选自霍格沃兹《测试开发实战进阶》课程教学内容,进阶学习文末加群。 数据驱动就是通过数据的改变驱动自动化测试的执行,最终引起测试结果的改变。简单来说,就是参数化在自动化测试中的…

企业生产管理必备模板,助力企业数字化转型

如今企业在市场经济中快速发展,不少企业在市场中得到了更好的发展机遇。然而机遇与挑战往往是共存的,市场同时也给制造企业生产方面提出了更高要求——企业需要在产品结构优化、生产系统改良以及运作模式创新的基础上,注重管理思维模式的改进…

【实时数仓】DWM层订单宽表之维表关联优化 -- 异步查询

文章目录一 DWM层-订单宽表1 维表关联代码实现(1)优化2:异步查询a 封装线程池工具类b 封装维度异步查询的函数类DimAsyncFunctionc 自定义维度查询接口DimJoinFunctiond 使用DimAsyncFunction关联用户维度源码测试配置配置表历史数据同步总结…

构建Web应用程序哪个最好:PHP,Python还是Ruby?

在本文中,我们将了解哪种PHP,Python和Ruby最适合构建Web应用程序。 什么是 Python? Python 是一种具有动态语义的解释型、面向对象的高级编程语言。其高级内置数据结构,以及动态绑定和动态类型,使其特别适合用作脚本…

如何计算并有效降低独立站的客户流失率?

关键词:客户流失率 独立站 对于跨境电商的独立站运营来说,现在获取一个新用户的成本越来越高,成本可能是维护现有客户的5倍;品牌有大约60%–70% 的机会向现有客户销售产品,而仅有大约 20% 的机会向新客户销售产品。 所以&#xff…

有奖征文活动:从 RTC 到 RTE,从音视频到「实时万象」!

Hi 小伙伴们, 社区已经更名 RTE 两个月辣~大家对于 RTC 和 RTE 的区分,是否还有疑惑呢?🤔 关于这两者的区别,我们创始人兼 CEO 赵斌老师说: “RTC(实时音视频)从 Commu…

k8s-Service简单学习

目录 Service介绍 Service类型 Service使用 实验环境准备 ClusterIP类型的Service HeadLiness类型的Service NodePort类型的Service LoadBalancer类型的Service ExternalName类型的Service Ingress介绍(最好) Ingress使用 环境准备 Http代理 …

网络安全实战之植入后门程序

在VMware上建立两个虚拟机:win7和kali。 Kali:它是Linux发行版的操作系统,它拥有超过300个渗透测试工具,就不用自己再去找安装包,去安装到我们自己的电脑上了,毕竟自己从网上找到,也不安全。它…

搞懂 Dubbo 入门理论,这一篇就够

RPC简介 ● RPC, Remote Procedure Call ,远程过程调用,是一种跨系统间服务调用的协议或框架 ● 在很多企业,在内部存在大量的业务子系统,这些子系统都承担独立的业务功能,并相互协作,实现企业…

[思维模式-10]:《如何系统思考》-6- 认识篇 - 结构决定功能,如何进行深度思考

目录 第1章 深度思考概述 1.1 深度思考的本质 1.2 深度思考的冰山模型 1.3 行为模式:结构与现象之间的桥梁 第2章 复杂多变的现象背后的六种基本的行为模式 第3章 透过模式/趋势看清内在的结构 第1章 深度思考概述 1.1 深度思考的本质 结构决定功能&#x…

超标量处理器设计——第三章_虚拟存储器

超标量处理器设计——第三章_虚拟存储器 参考《超标量处理器》姚永斌著 文章目录超标量处理器设计——第三章_虚拟存储器3.2 地址转换3.2.1 单级页表3.2.2 多级页表3.2.3 Page Fault3.3 程序保护3.4 加入TLB和Cache3.4.1 TLB的设计TLB缺失TLB的写入对TLB进行控制3.4.2 Cache的设…

时变电磁场 工程电磁场 P24

两个重要定律 首先是两个非常重要的定理 法拉第电磁感应定律完整形式: 应用斯托克斯定律,我们可以得到 在静止媒质钟我们有 全电流定律 对于非恒定的电流,我们可以写成 相应的微分形式 电磁感应定律与全电流定律构成了电磁场理论的基石 这两…

python自学难吗?零基础学python难吗?

作为一名小白,学习任务新东西的时候都会关系,要学的东西难吗?学习Python时自然也会关心Python难吗?能学会吗? 从编程语言的角度来看,Python相比于其他语言真的是不难,Python本身极简的语法&…

正点原子-Linux嵌入式开发学习-第二期03

第九讲:模仿STM32驱动开发实验 前言:在02中我们学习的如何使用C语言的知识去编写代码,并且是直接定义寄存器地址的。你自己回想一下,stm32的库文件是这样的吗?当然不是,它是继续封装了地址,把寄…

ACL介绍

ACL 中文:访问控制列表 介绍: ACL 是网络当中策略的一种,策略:我们之前学的内容只够我们把网络连通,但网络不仅仅是能连通那么简单,在保证网络能连通的基础上,应该还有更高一层的追求&#xf…

地统计插值学习心得(二)

简介 交叉验证是一种“留一”法,可用于确定插值模型与数据的拟合程度。交叉验证从数据集中移除一个点,并使用剩余的所有其他点来预测被移除点的位置。预测值随后与测量值进行比较,并生成大量统计数据 来确定预测的准确性。 交叉验证窗格可以用于展示并评价插值模型的执行效…