【版权声明】版权所有,严禁转载,严禁用于商业用途,侵权必究。
作者:厦门大学计算机科学与技术系2023级研究生 欧立瀚
指导老师:厦门大学数据库实验室 林子雨 博士/副教授
时间:2024年6月
相关教材:林子雨编著《Flink编程基础(Java版)》(访问教材官网)
相关案例:Flink大数据处理分析案例集锦
本案例数据集来源于Kaggle 公开项目 Hotel booking demand。使用pandas进行数据清洗,保存到分布式文件系统HDFS中,接下来使用Flink Python API 进行数据分析,主要使用其中的 Table API,最后,采用matplotlib进行可视化。
数据集和代码下载:从百度网盘下载本案例的代码和数据集。(提取码是ziyu)
1.数据集
1.1获取
数据集来源于 Kaggle 公开项目 Hotel booking demand(链接:Hotel booking demand (kaggle.com))
@@1.2数据集描述
该数据集为酒店预定记录。如图所示,数据集为 16.86 MB 大小 CSV 文件,共 119390 条记录。每条记录有包括 hotel、is_canceled、lead_time 等字段在内共32 个字段。
2.准备阶段
2.1数据预处理
1.对缺失值进行填充:
a)children字段中是数值型变量,且偏态分布,用中位数填充;
b)country字段是类别变量,用众数填充;
c)agent空值用0填充,表示没有代理;
d)company缺失值太多,删除变量。
2.对 arrival_date_month 字段数据格式进行处理,将其由英文字符转为数字格式。比如原来的六月为“July”转化为“6”
3.初始条件,餐饮字段中的Undefined / SC无餐套餐为一类
4.删除异常值
a)删除 adults 和 children 字段之和为 0 的记录
b)删除每日房价为负数的记录
c)删除 market_segment 为 Undefined 的记录
2.2上传到HDFS
启动HDFS:
使用 python hdfs 模块将上述预处理结果上传到HDFS:
从浏览器访问hdfs Web界面http://localhost:9870, 可以确认数据已经被上传到HDFS中:
3.使用 Flink 进行数据分析
3.1数据读取
本次实验使用Flink Python API 进行数据分析,主要使用其中的 Table API。
1.首先导入相关模块:
2.设置 env。这里使用批处理模式,同时把并行度设置为8:
3.利用 hdfs 模块,从 hdfs 中读取数据。
将数据首先读入为pandas DataFrame,再调用from_pandas() 方法将DataFrame数据转化为Flink Table。这样做的原因是用Flink自带的方式(FileDescritor、DDL语句等)读取csv文件比较繁琐,需要逐一指明字段名称与类型。
3.2酒店每月平均价格变化
1.利用Table Descriptor创建临时表(指明CSV格式),以保存酒店每月平均价格。临时表包含三个字段:月份、酒店类型、人均价格
2.按月和酒店类型分组,计算每个酒店每月的人均价格,并将结果保存于上述表中;
3.处理得到的 csv 文件如下图所示(截取部分):
3.3酒店每月入住量变化
1.利用Table Descriptor创建临时表(指明CSV格式),以保存酒店每月平均价格。临时表包含三个字段:月份、酒店类型、入住量
2.按月和酒店类型分组,计算每个酒店每月的人均价格,并将结果保存于上述表中;
3.处理得到的 csv 文件如下图所示(截取部分):
3.4游客分布
1.首先,利用Table Descriptor创建临时表(指明CSV格式),以保存处理结果。临时表包含三个字段:酒店类型、国家、预定人数
2.根据基于酒店类型和国家分组,统计游客的数量,并将结果存于临时表中:
3.处理得到的 csv 文件如下所示:
3.5不同价格区间酒店的预定情况
1.实现udf自定义函数,基于人均价格计算所属的价格区间:
2.按酒店类型和价格区间分组,统计取消总数和预定总数:
3.计算取消率(预定数除以总数,这里需要乘以0.1确保转化为浮点数)和实际入住数(预定数减去取消数):
4.首先,利用Table Descriptor创建临时表(指明CSV格式),以保存处理结果。临时表包含六个字段:价格区间、酒店类型、预定数、取消数、取消率、实际入住数。
5.处理得到的 csv 文件如下所示:
3.6游客入住天数
1.首先,利用Table Descriptor创建临时表(指明CSV格式),以保存处理结果。临时表包含三个字段:居住天数分类、酒店类别、人数
2.自定义函数用于将居住天数分为四类:
3.根据居住天数类别、酒店类别分组聚合
4.绘图分析
4.1酒店每月平均价格/入住量变化情况
上图是每月人均价格变化
上图是每月入住量变化
由图可以发现:
1、城市酒店4-5月(春季)和9-10月(秋季)为预定旺季,房价也相应提高
2、度假酒店3-5月份(春季)和10月份(秋季)为预定旺季,房价稍有上浮
3、对于两家酒店来说6-8月份均为淡季,但发现度假酒店在7-8月淡季反而房价很高,远高于其他月份
4、11月-来年1月份(冬季)为预定淡季
4.2游客分布
由图可见,游客主要分布于欧洲地区,其次是北美。
4.3不同价格区间酒店的经营情况
不同价格区间酒店的预订量:
不同价格区间酒店的入住量:
不同价格区间酒店的取消率:
大多数旅客还是选择人均价格在(0,100)区间的酒店入住;度假酒店的取消率有随着价格区间增长而增长的趋势。
4.4游客入住天数
大多数游客住2-5晚,且住宿时间越长,越倾向于选度假酒店。
补充说明:代码目录结构
1.dataset 目录:存放数据集
2.figure 目录:存储Flink分析得到的结果,用于绘图
3.flink.ipynb:Flink 数据分析代码
4.plot.ipynb:绘图代码
5.prepare.ipynb:数据预处理代码