旅游网站(携程网部门数据)大数据分析-hadoop课程设计(本科课设级别) ...

打印 上一主题 下一主题

主题 837|帖子 837|积分 2511

旅游网站(携程网部门数据)大数据分析-hadoop课程设计(私信获取完整代码)

最终数据可视化样式


绪论

研究背景

当今期间信息资源日益丰富大量,信息资源的利用对社会的发展起着主要作用,运用信息技术帮忙产业设计越来越成为行业发展的告急趋势。
旅游产业是典型的体验服务产业,在任何发展阶段,信息反馈的准确性与及时性都具有非凡的意义。大数据的3V特征,海量的数据规模(Volume)、快速的数据流转和动态的数据体系(Velocity)、多样的数据范例(Variety)都可以或许很好地满意旅游产业对信息的各方面需求。从现阶段发展来看,旅游大数据在系统了解旅游市场构成、细分市场特征、消耗者需求和竞争者状态,包管品牌市场个性化方面以及在统计分析消耗者举动、兴趣偏好和产品的市场口碑,有针对性地制订旅游产品和营销筹划方面;在帮助企业管理者掌握旅游行业潜在的市场需求推进旅游行业收益管理等方面得到了有用应用,大数据分析技术在定制旅游上的应用更是渐渐发展成为一种全新的旅游生产方式。本文通过分析国内旅游市场近况、大数据的应用特点以及现有定制旅游网站产品服务的模式及特征,试图通过某种方式明白旅游用户的真正需求,从而帮助实现定制旅游网站的产品及服务设计最优。
研究近况

“定制旅游”是旅游市场发展的需要,同样是高度同质化的在线旅游市场发展的效果。它是以旅游者为主导进行旅游行动流程的设计,通常根据旅游者的消耗能力,以满意其个性化的需求为原则,,设计出最大限度符合旅游者心理预期产品的一种旅游方式。定制旅游发展到现在不仅包罗面向垂直细分人群的旅游产品设计更衍生出多种在线旅游产品平台模式。通过资料研究,现有基于大数据的定制旅游网站一般为两种模式。
其一,“反向定制”旅游网站模式。基于巨大的用户数据,进行旅游用户群举动的预测,从而根据旅游用户群体的喜好或消耗倾向,制订相应主题的旅游产品。
其二,自主旅游定制模式。由旅游者提出具体求,旅游平台进行对接。“反向定制”模式创造性地联合了多样化与标准化,在满意客户个性化需求的同时,可以或许降低定制本钱,加速定制速率。而自主旅游定制模式要求网站可以或许第一时间对用户需求做出反应,这里是指利用大数据和智能化技术,为用户一键生成出游门路筹划。两种模式的定制旅游突破了传统旅游典型的标准化产品和服务,向人们展示了一种更便捷、更主动的旅行方式,在产品或服务的设计过程中,行程筹划根据用户的需求定制,使旅行的机动性极大增强,有用提拔了旅游质量。自主定制旅游更突出科技的高效精准,大数据挖掘技术取代旅游用户本人做了行前大量的准备、调研工作,可以或许节流用户更多的时间本钱。
然而,通过实例分析,现有定制旅游网站在概念层面以及满意用户个性化需求层面上存在不同程度的范围性。所谓“定制”是指个人属性强烈的产品,“反向定制”突出反映产品设计中人们普遍关注一个在线旅游用户群体,而较少从旅游用户个体的角度进行关联分析的近况;自主旅游模式更是从用户简单的几步倾向选择出发,进行用户求片面妄断。两种旅游定制模式严格意义上无法真正触及每个旅游个体用户的真正心理,无法实现真正的个性化定制。
开发情况

本文用到的开发情况如下:

  • IDEA 2018.3
  • Hadoop 2.7.2
  • Zookeeper 3.4.10
  • Hive 1.2.1
  • HBase 1.3.1
  • Echarts 5.1.1
数据抓取和洗濯

相干技术

Jsoup

Java中支持的爬虫框架有许多,比如WebMagic、Spider、Jsoup等。我们利用Jsoup来实现一个简单的爬虫步调。
Jsoup拥有十分方便的api来处理html文档,比如参考了DOM对象的文档遍历方法,参考了CSS选择器的用法等等,因此我们可以利用Jsoup快速地掌握爬取页面数据的本事。
数据抓取

利用Jsoup抓取旅游网站数据

通过Jsoup对网页中有用的数据进行解析,之后我们将得到想要的数据。获取都会所有信息,首先需要获取到都会名称也就是获取所有<dd></dd>标签中的所有a链接的文本。
数据洗濯

数据洗濯是指发现并改正数据文件中可辨认的错误的最后一道步调,包罗检查数据一致性,处理无效值和缺失值等。与问卷审核不同,录入后的数据整理一般是由盘算机而不是人工完成。
利用Jsoup获取到的是整个页面的资源,此中包罗html的代码,也就会包罗无意义的数据,需将它进行洗濯。

  • 获取所有<dd></dd>标签。
    Elements all_dd = pinyin_filter.getElementsByTag(“dd”);
  • 获取<dd></dd>标签下的所有a标签。
    String cityID = StringUtil.getNumbers(element.attr(“href”));
  • 获取所有a标签中的文本并添加到HotelCity类中,HotelCity实体类信息如表2-1所示:
表2-1 HotelCity实体类信息
idintnamevarcharpricedoublelatdoublelondoubleurlvarcharimgvarcharscoredoubledpsocreintstarvarcharstardescvarcharshortNamevarchar 核心代码如下:
  1. String headPinyin = dt_headPinyin.text();
  2. hotelCity.setHeadPinyin(headPinyin);
复制代码
洗濯无意义数据

将获取到携程网的都会旅店的HTML数据(包罗所有元素)进行洗濯,得到我们需要的标签数据。为了更好的解析数据,我们要将一些无意义的数据进行洗濯。Jsoup在这里提供了一个方便的洗濯数据方法。然后就可以通过Jsoup进行数据的洗濯。
获取所有旅店信息

通过分析旅店相干信息是ajax加载存放在json数据中,代价也在同一个json中但是放在另外的位置通过旅店id对应,而且哀求方式是POST,哀求的参数有许多,经查验可只传都会id获取,下面简单介绍通过网络哀求将json数据拿到,最后将告急数据进行截取,返回一个清晰告急的json数据,再对json数据进行解析便可得到旅店相干信息。
数据存储

相干技术

HBase

HBase是一个分布式的、面向列的开源数据库,该技术来源于Fay
Chang所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File
System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
结构介绍

HBase——Hadoop
Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储,利用HBase技术可在廉价PC
Server上搭建起大规模结构化存储集群。
与FUJITSU Cliq等商用大数据产品不同,HBase是Google Bigtable的开源实现,类似Google
Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop
HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop
MapReduce来处理HBase中的海量数据;Google
Bigtable利用Chubby作为协同服务,HBase利用Zookeeper作为对应。
下图描述Hadoop EcoSystem中的各层系统。此中,HBase位于结构化存储层,Hadoop
HDFS为HBase提供了高可靠性的底层存储支持;Hadoop
MapReduce为HBase提供了高性能的盘算能力;Zookeeper为HBase提供了稳定服务和failover机制。

图3-1 HBase结构图
存储格式

HBase中的所有数据文件都存储在Hadoop
HDFS文件系统上,主要包罗上述提出的两种文件范例:

  • HFile,HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,现实上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile。
  • HLog File,HBase中WAL(Write Ahead Log)的存储格式,物理上是Hadoop的Sequence
    File。
存储旅店数据

HBaseUtil工具类设计


  • 创建Hbase表的方法
代码如下:
  1. public static void createTable(String tableName, String... columnNames) throws IOException {
  2. startConn();
  3. //获取表对象操作
  4. Admin admin = conn.getAdmin();
  5. TableName tableNameObj = TableName.valueOf(Bytes.toBytes(tableName));
  6. //判断表是否为空
  7. if (tableName != null && !tableName.isEmpty()) {
  8.    if (!admin.tableExists(tableNameObj)) {
  9.   HTableDescriptor hdr = new HTableDescriptor(tableNameObj);
  10.   for (String columnName : columnNames) {
  11. ​    hdr.addFamily(new HColumnDescriptor(columnName));}
  12.   admin.createTable(hdr);
  13. }
  14. }
  15. closeConn();
  16.   }
复制代码

  • 向指定表插入数据的方法
代码如下:
  1. public static long putDataByTable(String tablename, List<Put> puts) throws Exception {
  2.   startConn();
  3.   long currentTime = System.currentTimeMillis();
  4.   Table table = conn.getTable(TableName.valueOf(Bytes.toBytes(tablename)));
  5.   try {
  6.       table.put(puts);
  7.   } finally {
  8. table.close();
  9. closeConn();
  10.   }
  11.   return System.currentTimeMillis() - currentTime;  //返回插入数据花费的时间(毫秒)}
复制代码
旅店信息表

表名: t_city_hotels_info
列族:cityInfo、hotel_info
列族cityinfo下的列:cityId、cityName、pinyin、collectionTime
列族hotel_info下的列:id、name、price、lon、url、img、address、score、dpscore、dpscore、dpcount、star、stardesc、shortName、isSingleRec
从Hotel实体类中提取数据并保存到Hbase表中。
核心代码如下:
旅店评论信息表

表名: t_hotel_comment
列族:hotel_info、comment_info
列族c hotel_info下的列:hotel_name、hotel_id
列族comment_info下的列:id、baseRoomId、baseRoomName、checkInDate、postDate、content、highlightPosition、hasHotelFeedback、userNickName
从HotelComment实体类中提取数据并保存到Hbase表中。
核心代码如下:
  1. List<Hotel> parseArray = JSONObject.parseArray(readFileToString, Hotel.class);
  2. List<Hotel> hongkongHotel = JSONObject.parseArray(hongkong, Hotel.class);
  3. parseArray.addAll(hongkongHotel);
  4. HBaseUtil.putDataByTable("t_city_hotels_info", puts);
复制代码
MapReduce步调——统计均匀代价


  • Mapper阶段
输入范例:< ImmutableBytesWritable, Result>
输出范例:<ImmutableBytesWritable, DoubleWritable>
在Mapper阶段,从Hbase表t_city_hotels_info中读取数据,查询出每个RowKey的列cityInfo:cityName、列hotel_info:price对应的值。将列cityInfo:cityName对应的值设置为输出的K、列hotel_info:price对应的值设置为输出的V。
核心代码如下:
  1. byte[] cityName = value.getValue(Bytes.toBytes("cityInfo"), Bytes.toBytes("cityName"));
  2. k.set(cityName);
  3. byte[] byte_price = value.getValue(Bytes.toBytes("hotel_info"), Bytes.toBytes("price"));
  4. double doulble_price = Double.parseDouble(Bytes.toString(byte_price));
  5. v.set(doulble_price);
  6. context.write(k, v);
复制代码

  • Reducer阶段
    输入范例:<ImmutableBytesWritable, DoubleWritable>
输出范例:<ImmutableBytesWritable, Put>
在Reducer阶段,从Mapper中取出数据,取出具有类似的K的V,求均匀值。
将效果输出到Hbase表AveragePrice,将K设置为RowKey,均匀值设置为列info: price的值。
核心代码如下:
  1. for (DoubleWritable value : values) {
  2. sum += value.get();
  3. count++;}
  4. double average = sum / count;
  5. v.addColumn(Bytes.toBytes("info"), Bytes.toBytes("price"),         Bytes.toBytes(String.valueOf(average)));
  6. context.write(key,v);
复制代码

  • Driver阶段
Hbase提供了TableMapReduceUtil的initTableMapperJob和initTableReducerJob两个方法来完成MapReduce的配置。需指定Mapper要读取的表以及Reducer分析数据后要导入的表。
核心代码如下:
  1. TableMapReduceUtil.initTableMapperJob(
  2. "t_city_hotels_info",
  3. new Scan(),
  4. APMapper.class,
  5. Text.class,
  6. IntWritable.class,
  7. job);
  8. //reducer
  9. TableMapReduceUtil.initTableReducerJob(
  10. "AveragePrice",
  11. CWReducer.class,
  12. job);
复制代码
MapReduce步调——统计词频

word分词是一个Java实现的中文分词组件,提供了多种基于辞书的分词算法。能准确辨认英文、数字,以及日期、时间等数量词,能辨认人名、地名、组织机构名等未登录词。通过HBASE的MapReduce进行数据分析,得到词频较高的数量并进行汇总。

  • Mapper阶段
输入范例:< ImmutableBytesWritable, Result>
输出范例:<Text, IntWritable>
在Mapper阶段,从Hbase表t_hotel_comment中读取数据,查询出每个RowKey的列comment_info:
content对应的值。将列comment_info:
content对应的值设置为输出的K、该词出现次数指定为1并设置为V。
核心代码如下:
  1. private static byte[] family = "comment_info".getBytes();
  2. private static byte[] column = "content".getBytes();
  3. byte[] value = result.getValue(family, column);
  4. String word = new String(value,"utf-8");
  5. if(!word.isEmpty()){
  6. String filter = EmojiParser.removeAllEmojis(word);
  7. List<Word> segs = WordSegmenter.seg(filter);
  8. for(Word cont : segs) {
  9. Text text = new Text(cont.getText());
  10. IntWritable v = new IntWritable(1);
  11. context.write(text,v);
  12. }
  13. }
复制代码

  • Reducer阶段
    输入范例:<Text, IntWritable>
输出范例:<ImmutableBytesWritable, Put>
在Reducer阶段,从Mapper中取出数据,取出具有类似的K的V,求和。将效果输出到Hbase表CountWord,将K设置为RowKey,求和效果设置为列word_info:
count的值。
核心代码如下:
  1. int sum=0;
  2. for(IntWritablevalue:values){
  3. sum+=value.get();
  4. }
  5. Put put=new Put(Bytes.toBytes(key.toString()));
  6. put.addColumn(family,column,Bytes.toBytes(sum));
  7. context.write(null,put);
复制代码

  • Driver阶段
需指定Mapper要读取的表以及Reducer分析数据后要导入的表。
核心代码如下:
  1. //mapper
  2. TableMapReduceUtil.initTableMapperJob(
  3. "t_hotel_comment",
  4. new Scan(),
  5. CWMapper.class,
  6. Text.class,
  7. IntWritable.class,
  8. job);
  9. //reducer
  10. TableMapReduceUtil.initTableReducerJob(
  11. "CountWord",
  12. CWReducer.class,
  13. job);
复制代码
数据可视化

相干技术

数据可视化主要是对数据分析得到的效果进行可视化,形成直观的图表展示。对于分析出来的数据,我们只有将他们进行展示才能彰显分析出来的数据的真正的价值,因此一个好的可视化框架至关告急,因此,我们将选取Echarts作为我们数据可视化的框架。
Echarts

ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。
丰富的可视化范例。ECharts
提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的核型图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、旭日图,多维数据可视化的平行坐标,还有用于
BI 的漏斗图,仪表盘,而且支持图与图之间的混搭。
除了已经内置的包罗了丰富功能的图表,ECharts
还提供自定义系列,只需要传入一个renderItem函数,就可以从数据映射到任何你想要的图形,更棒的是这些都还能和已有的交互组件联合利用而不需要操心别的事变。
你可以在下载界面下载包罗所有图表的构建文件,假如只是需要此中一两个图表,又嫌包罗所有图表的构建文件太大,也可以在在线构建中选择需要的图表范例后自定义构建。
多种数据格式无需转化直接利用。ECharts 内置的 dataset
属性(4.0+)支持直接传入包罗二维表,key-value 等多种格式的数据源,通过简单的设置
encode
属性就可以完成从数据到图形的映射,这种方式更符合可视化的直觉,省去了大部门场景下数据转换的步调,而且多个组件可以或许共享一份数据而不消克隆。为了配合大数据量的展现,ECharts
还支持输入 TypedArray 格式的数据,TypedArray
在大数据量的存储中可以占用更少的内存,对 GC
友好等特性也可以大幅度提拔可视化应用的性能。
可视化图表设计

旅店代价分布图

本设计采用Echarts作为可视化数据展示框架,并采用柱状图展示旅店代价分布,
最终效果如图5-1所示。

图 5-1 旅店代价分布图
旅店均匀代价对比图

旅店均匀代价对比图,最终效果如图5-2所示。

图 5-2 旅店均匀代价对比图
旅店房型统计图

旅店房型统计图,最终效果如图5-3所示。

图 5-3 旅店房型统计图
数据可视化展示

通过echarts框架可以轻松实现数据的可视化展示,下图是根据echarts统计绘制的图表信息。

图 5‑4 携程网数据分析
结语

由于受硬件资源的限定,本项目只分析了携程网部门旅店的信息。在统计词频这一MR步调上,由于调用了第三方Jar包,导致在服务器上运行MR步调的过程中遇到了ClassNotFoundException。经多次调试依旧无法办理问题。考虑到数据量相对较小的情况,最终通过JAVA
SE步调设计分析数据并转存到HBase中。
考虑到工作量的问题,本设计最终可视化展示为静态网页。同时由于小组缺少美工,最终展示效果较为单调。
参考文献


  • 王泽梁,汪丽华."互联网+旅游大数据期间旅游人才盘算机能力培养[J].西昌学院学报(自然科学版),2019,33(3):109-113.
  • 刘力钢,陈金大数据期间疆域地区县域全域旅游目的地品牌形象提拔策略[J].企业经济,2019,38(10):48-54.
  • 吕雨阶.大数据背景下智慧旅游管理模式研究[J].旅游纵览(下半月),2019(18):34-35.
  • 彭灵芝.大数据期间在线旅游企业发展路径研究[J].商场现代化,2019(17):138-139.
  • 秦燕.大数据在旅游管理中的应肌[J]佳木斯职业学院学报,2019(9):61-62.
  • 王秀玲大数据在旅游统计中的应用研究[J].产业与科技论坛,2018,17(23);:47-48.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表