大数据毕业设计hadoop+spark旅游推荐系统 旅游可视化系统 地方旅游网站 旅游爬虫 旅游管理系统 计算机毕业设计 机器学习 深度学习 知识图谱

基于hive数据仓库的贵州旅游景点数据分析系统的设计与实现

摘  要

随着旅游业的快速发展和数字化转型,旅游数据的收集和分析变得越来越重要。贵州省作为一个拥有丰富旅游资源的地区,旅游数据的分析对于促进旅游业的发展和提升旅游体验具有重要意义。基于Hive数据仓库的贵州省旅游景点数据分析系统的设计与实现,旨在建立一个高效、可靠且功能丰富的系统,帮助利益相关者准确理解和利用旅游数据,为决策和规划提供可靠依据。

本系统通过数据采集与存储模块,将贵州省的旅游景点数据收集到一个中心化的数据平台,确保数据的准确性和一致性。同时,借助Hive数据仓库的设计,实现了灵活的数据模型和高效的数据查询与分析能力。系统的功能模块设计包括数据导入模块和查询与分析模块,前者实现了对新数据的导入和预处理,后者提供了多维度的数据查询和分析功能。

关键词:hive  旅游

1.1研究背景及意义

  贵州省作为中国的旅游目的地之一,拥有丰富多样的自然景观和独特的民族文化,吸引了大量的游客前来观光和旅游。如今,随着旅游业的迅速发展和智能化技术的进步,对于旅游数据的分析和利用变得越来越重要。然而,目前尚缺乏一个完备的贵州省旅游景点数据分析系统,以全面、准确地了解和管理贵州省的旅游景点数据,为相关决策提供支持和参考。

本项目的目的是基于Hive数据仓库,设计和实现一个贵州省旅游景点数据分析系统,旨在为用户提供方便、快捷的数据分析和查询功能,帮助相关人员深入了解贵州省旅游景点的情况,提供数据支持和参考,促进旅游业的持续发展。

总之,贵州省旅游景点数据分析系统的设计与实现将为贵州旅游业的发展带来巨大的推动力,为决策者提供科学的决策依据,提升景区的运营效率和服务质量,进一步提升贵州省作为旅游目的地的知名度和吸引力。

1.2 开发现状

  国外与国内相比下来,国外由于互联网很早就拥有了分析系统,因此,他们对于旅游分析系统方面的研究远比国内深入,而纵观几十年来的科技发展,可以很清楚的看到他们的旅游分析系统的发展阶段,具体可以分为三个阶段。

  1. 初始阶段:1959年IBM公司的销售员R. Blair Smith建议美国航空公司总裁C.R.Smith一起去开发一个计算机订位系统(SABRE),1960年世界首个计算机订位系统诞生。
  2. 发展阶段:由于科技的发展,1979年-1995年这期间很多机票的购买,酒店预订,乘车等事务都可以通过网络来完成,这让旅游系统得到更多的关注,大大推进了旅游网站的发展.
  3. 高潮阶段:旅游文化的兴起,1995年世界旅游组织,以及国外多个旅游机构举办了世界信息技术与旅游会议,体现出计算机与旅游业密不可分的关系。

国内的旅游信息化与国外相比由于起步较晚以及多种原因,等到改革开放后才开始有这方面的研究,即使起步晚经过国人的不断学习与研究,在旅游信息化科技发展方面已经堪比国外大国了。国内旅游网站发展可以分为三个阶段。

  1. 萌芽阶段:由于改革开放,大量国外旅游文化与科技涌入国内,1998年-2002年在互联网技术发展蓬勃时,旅游网站也因此出现在人们的视野
  2. 发展阶段:以前国内旅游网站主要以服务为主,在2003年-2008年这期间由于互联网的飞速发展,在以往以服务为主的基础上加上了旅游路线,以及在线旅游模式,这让国内旅游网站的用户迎来了爆发式的增长。
  3. 成熟阶段:从2008年以后,旅游网站已经成了我国游客必不可少的工具,即使已经成熟,但是仍然在稳步发展。

2 开发工具及相关技术

2.1 Hive描述

Apache Hive是一个容错分布式的数仓系统,可实现大规模分析。 而且Hive 元存储(HMS提供了一个元数据的中央存储库可以很快速的分析做出有用的信息数据驱动的决策,因此它多数据湖架构的关键组成部分。 Hive通过Apache Hadoop建立再由hdfs支持S3,adls,gs等存储。除此之外Hive 允许用户使用 SQL 读取、写入和管理数据。

优点:

  1. Hive不用去写MapReduce,大大减少了程序员的学习成本。
  2. Hive可以更好地处理大数据,由于延迟高的问题,处理小数据没有优势。
  3. Hive简单,易上手,拥有快速开发的能力
  4. 支持用户自定义函数

缺点:

  1. 调优困难
  2. 不擅长数据挖掘
  3. 不能表达迭代算法

2.2 MySQL描述

MySQL是一个DBMS(数据库管理系统)。由于它的体积小,总体拥有成本低,速度快,开放源码等特点,也让它成为了当前最流行的关系型数据库管理系统,很多中小型的网站开发者都会用MySQL使用SQL语言操作,将MySQL作为网站数据库。

优点:

  1. 体积小,总体拥有低,速度快,开放源码。
  2. 核心采用多线程编程,使用多线程实现MySQL可以充分利用CPU资源。
  3. 支持Windows,Linux,HP-UX,OpenBSD等多种操作系统。
  4. MySQL有安全的权限和口令系统,支持主机认证。

缺点:

  1. 不支持自定义数据类型。
  2. 安全系统过于复杂。
  3. 对触发器支持和存储过程不友好。
  4. 不能备份。

2.3 Spring Boot概述

Spring Boot是一个快速开发的框架。用于简化加快Spring应用的建立,运行,调节测试和安装部署。可以更好地解决依赖问题,简化并且加快了Java web的开发,让开发人员可以更合理的运用自己的开发时间。

优点:

  1. 能够快速建立项目。
  2. 提高了开发和部署的效率。
  3. 不用外部依赖Servlet容器也可以独立运行。
  4. 不用配置也可以也可以对主流开发框架进行开发。

2.4 Pycharm简介

Pycharm是一种Python IDE,是Python语言的高效率开发工具,如项目管理,调试,单元测试,代码跳转,版本控制,智能提示等。

优点:

  1. 支持web框架开发,如Flask,Pyramid,Django。
  2. 能够快速精确地修复bug。
  3. 可在远程主机上进行程序开发。

缺点:

  1. 界面过于复杂。
  2. 成本过高。

2.5 Vue.js 描述

Vue是一款用于构建用户界面的JavaScript框架。他基于CSS,HTML,JavaScript构建。可以高效的构建想要的界面。还是一个渐进式框架,可以逐步集成且相当灵活。

优点:

  1. 能够修改和使用现有的应用程序。
  2. 无论简单还是复杂都能够集成小部件且不会影响系统。
  3. 可以更好的编辑文档。
  4. 具有很强的适应性。

缺点:

  1. 不支持IE8。
  2. 存在程序开发问题。

(1)技术方面,本系统使用了Hive,MySQL技术来支持数据逻辑与事务,P然后前台的页面显示用H5来做,Python来爬取数据,Spring Boot做前端的框架。这些技术都由本人在课堂上经过学习积累所得以及一些编程网站学习所得。这些技术都有在课堂上做不同的项目实践过,可以更好地开发系统。从技术方面来看,这个系统是可以实现的。

(2)经济方面,因为这个系统的目的是为游客提供更好的旅游路线以及购票服务,还有工作人员更好的管理后台,这就是我们能够直接使用信息化软件,而且这个系统主要成本集中于对数据后期的维护和管理,他所提供的高效率和低成本远远低于一般的系统。同时也可以很明显的发现这个系统的实际应用方面的价值已经超过了系统实际开发和维护所需的成本,因此从经济上说,本系统是可行的。

(3)实用方面,本系统包含了购票,评论,相关景点推荐,在当前大时代是紧跟时代潮流的,还有更优的旅游路线,游客可以通过互联网更清晰的了解到自己需要的东西,并且非常便捷和快速,还提高了游客的体验感觉。所以从实用方面也是可行的。

前台分为未注册和已注册两种服务需求。

未注册用户:

注册账号:用户填写个人信息并进行验证。

浏览景点:用户可以从景点分类中查看某个景点的信息如“名称,特点,景点地区,票价,其他用户的评论”。

已注册用户:

登录:用户输入账号及密码进行登录。

修改个人信息:用户进入个人信息面板可对信息进行修改。

点击评论:用户点击评论可查看其他用户对该景点的评价。

购票:用户点进购票页面,根据自己的需求可以去购买相应的票据。

评论:用户可以经过自己的感受对景点做出评论

景点资讯:用户登录后可以查看系统中最新的资讯。

景点信息:用户可以根据需求点击相应的景点浏览信息。

推荐:用户在浏览景点后在此基础上推荐类似的景点,形成推荐列表,提供给用户更好的购票等,还能购票删除记录。

3.3.2 后台管理员功能

登陆密码修改:管理员可以修改自己的登录密码,保障系统的安全性。

处理购票单:管理员可以查看购票单信息。

景点信息管理:管理员可以对景点信息进行增加,修改,删除,维护。

景点分类管理:管理员可以对景点分类进行增加,修改,删除,维护。

评论管理:管理员可以查看用户评论,给出建议,还可以删除评论。

用户管理:管理员可以管理用户并查看用户信息。

核心算法代码分享如下:

import csv
import time

import requests
from DrissionPage import ChromiumPage
from DrissionPage.common import ActionChains

# 创建页面对象,并启动或接管浏览器
page = ChromiumPage()
import re
import pymysql
#area_list = ['北京','天津','上海','重庆','河北','山西','辽宁','吉林','黑龙江','江苏','浙江','安徽','福建','江西','山东','河南','湖北','湖南','广东','海南','四川','贵州','云南','陕西','甘肃','青海','台湾','内蒙','广西','西藏','宁夏','新疆']
area_list = ['云南',]
zxs=['北京','天津','上海','重庆']

# 数据库配置信息
host = "localhost"
port = 3306
user = "root"
password = "123456"
database = "tour"
# 连接mysql
conn = pymysql.connect(host=host, port=port, user=user, password=password, database=database)
cursor = conn.cursor()

def existsTour(name):
    sql="select count(*) from tb_tour where  name='%s'"
    connect = None
    connect = pymysql.connect(host="localhost", port=3306, user="root",
                              password="123456", database="tour")
    cur = connect.cursor()
    print(sql % name)
    cur.execute(sql % name)
    exist_count = cur.fetchmany(1)
    if exist_count[0][0] > 0:
        return 1
    else:
        return 0

def address2(address):
    url="xxxxxxxxxxxxxxxx"%('f1063cfc84a84bd3b1d3a339c87b8bd0',address)
    data=requests.get(url)
    contest=data.json()
    #返回经度和纬度
    print(contest)
    contest=contest['geocodes'][0]
    print(contest)
    return contest

for area in area_list:
    #url="xxxxxxxxxxxxxxxx"
    url="xxxxxxxxxxxxxxxx"
    req_urk=url % area
    # 跳转到登录页面
    page.get(req_urk)
    # 换成景点门票
    ele = page.ele('xpath://ul[@class="search_type_tab"]//li[@data-type="TICKET"]')
    ele.click()
    ele = page.ele('xpath://input[@class="lv_search w_380"]')
    # 输入对文本框输入账号
    ele.input(area)
    # 点击登录按钮
    page.ele('xpath://span[@class="btn_lv_search"]').click()
    #time.sleep(3)
    ac = ActionChains(page)
    # for s in range(1, 10):
    #     # print(name)
    #     ac = ac.scroll(delta_y=20000)
    #总页码
    #page.run_js("window.scrollTo(0, document.body.scrollHeight)")

    #time.sleep(10)
    pages=int(page.ele('xpath://div[@class="pagebox"]/a[last()-1]/text()'))
    pages=int(pages)
    for p in range(0,pages):
        #cp=page.ele('xpath://div[@class="pagebox"]/a[@class="nextpage"]')
        #cp.click()
        # 滑动到底部


        cp_url="xxxxxxxxxxxxxxxx"+str(p+1)+"?keyword="+area+"&tabType=ticket#list"
        page.get(cp_url)

        #开始取值
        tours=page.eles('xpath://div[@class="product-regular clearfix"]')
        for tour in tours:
            #景点名称必然能取到并且不报错
            name=tour.ele('xpath://div[@class="product-section"]/h3[@class="product-ticket-title"]/a/text()')
            if existsTour(name) == 1:
                print('景点',name,'存在,无需反复爬取!')
                continue
            try:

                AAAAA_Str=tour.ele('xpath://span[@class="level"]/text()').strip()
                grade=str(len(AAAAA_Str))+'A'
            except :
                grade='0A'
            try:
                address=tour.ele('xpath://dl[1]/dd/@title').strip()
            except:
                address = name

            try:
               intro=tour.ele('xpath://dl[4]/dd/div').raw_text.strip()
            except:
                intro='暂无'
            try:
              #异常说明也没评论数据
              hot=tour.ele('xpath://ul[@class="product-number"]/li[1]/b/text()').strip()
            except:
              hot=0

            #评分
            score=hot

            # 评论数 评分连接
            try:
                # 异常说明也没评论数据
                c_str = tour.ele('xpath://ul[@class="product-number"]/li[2]/a/text()').strip()
                result = re.findall("\d+", c_str)
                comments = result[0]
                comments_url=tour.ele('xpath://ul[@class="product-number"]/li[2]/a/@href').strip()
            except:
                comments = 0
                comments_url='暂无'




            price =tour.ele('xpath://div[@class="product-price"]/em/text()').strip()
            try:
              #异常说明也没售出数据
              sold_str=tour.ele('xpath://ul[@class="product-number"]/li[2]/a/text()').strip()
              result = re.findall("\d+", sold_str)
              msold =result[0]
            except:
              msold=0
            #lng lat调用工具
            print('#正在调用高德地图API获取经纬度===================================================')
            try:

                resp_add=address2(address)
                print('高德返回结果',resp_add)
                #lng=resp_add.split(',')[0] #经度
                #lat=resp_add.split(',')[1] #纬度
                lng = resp_add['location'].split(',')[0]  # 经度
                lat = resp_add['location'].split(',')[1]  # 纬度
            except:
                lng='102.712251'
                lat='25.040609'
            #district = resp_add['district']  # 纬度
            print('经度',lng,'纬度',lat)
            print('#正在调用高德地图API获取经纬度===================================================')

            img=tour.ele('xpath://img/@src').strip()

            province_city = tour.ele('xpath://span[@class="city"]/text()').strip()
            province_city = province_city.replace('[', '')
            province_city = province_city.replace(']', '')
            province_city_arr = province_city.split('·')
            city_ = province_city_arr[0]
            if city_ in zxs:
                province = ''
                city = province_city_arr[0]
                district = province_city_arr[1]
            else:
                province = province_city_arr[0]
                city = province_city_arr[1]
                district = district = resp_add['district'] #从高德地图取
            sql = "replace into tb_tour (name,grade,address,intro,hot,price,msold,lng,lat,img,province,city,district) " \
                  "values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
            #data = (name, grade, address, intro, hot, price, msold, lng, lat, img, province, city, district,comments,comments_url)
            data = (name, grade, address, intro, hot, price, msold, lng, lat, img, province, city, district)
            print(name, grade, address, intro, hot, price, msold, lng, lat, img, province, city, district,comments,comments_url)
            try:
                cursor.execute(sql, data)
            except:
              print('sql出错',sql%(name, grade, address, intro, hot, price, msold, lng, lat, img, province, city, district))
              continue
            #cursor.execute(sql, data)
            conn.commit()
            ########向景点csv写内容
            tours_file = open("tours.csv", mode="a+", newline='', encoding="utf-8")
            tours_writer = csv.writer(tours_file)
            address = address.strip().replace(',', ',').replace('"', '').replace("'", '').replace("\n", '').replace('\r','').replace( '\t', '')
            intro = intro.strip().replace(',', ',').replace('"', '').replace("'", '').replace("\n", '').replace('\r','').replace( '\t', '')
            name = name.strip().replace(',', ',').replace('"', '').replace("'", '').replace("\n", '').replace('\r','').replace( '\t', '')
            tours_writer.writerow(
                [name, grade, address, intro, hot, price, msold, lng, lat, img, province, city, district,comments,comments_url])
            tours_file.close()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis分布式锁的优化

分布式锁 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的实现 分布式锁的核心是实现多进程之间互斥,而满足这一点的方式有很多,常见的有三种: MySQLRedisZookeeper互斥利用mysql本身的互斥锁机制利…

LangChain-03 astream_events 流输出

内容简介 尝试用 FAISS 或 DocArrayInMemorySearch 将数据向量化后检索astream_events 的效果为 |H|arrison| worked| at| Kens|ho|.|| 安装依赖 # 之前的依赖即可 pip install --upgrade --quiet langchain-core langchain-community langchain-openai # Win或Linux用户可…

摸鱼toyaml.com更新

摸鱼https://toyaml.com/windowsupdate.html

一次MySQL事务的旅程:Buffer Pool, Binlog, Redo Log揭秘

MySQL中的各种Buffer和Log以及表空间 MySQL中一次事务涉及了各种Buffer,Log和表空间,主要涉及:Buffer Pool, Binlog, Undo Log, Redo Log以及表空间。 我们来探讨下。 Buffer Pool Buffer Pool主要存放在内存中,它是一个缓存区域&#xf…

36---USB HUB电路设计

视频链接 USB HUB电路设计01_哔哩哔哩_bilibili USB HUB 电路设计 1、USB HUB基本介绍 USB Hub,指的是一种可以将一个USB接口扩展为多个,并可以使这些接口同时使用的装置。 Hub也是大家常说的集线器,它使用星型拓扑结构连接多个USB接口设…

【御控物联】JavaScript JSON结构转换(17):数组To对象——键值互换属性重组

文章目录 一、JSON结构转换是什么?二、核心构件之转换映射三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…

vue 条件渲染、列表循环渲染、事件绑定 初探第三天

条件渲染 <script>const app Vue.createApp({data(){return {show:true,conditionOne: false,conditionTwo: true,}},template:<div v-if"show"> hello word </div><div v-if"conditionOne"> if </div><div v-else…

HWOD:将字符串中的数字用*括起来

一、知识点 当需要类似括号( )这样成对出现的字符时&#xff0c;可以通过设置flag来标示 比如flag等于0表示前面所有的括号都是成对的 flag等于1表示最靠近的括号是未成对的&#xff1b;满足条件时&#xff0c;补齐括号&#xff0c;使其成对&#xff0c;flag置0 二、题目 …

如何展示科技产品的原理和应用

一、合理安排展示区域 不同的科技产品具有不同的展示需求&#xff0c;设计师需要根据展品的特点和大小&#xff0c;合理安排展示区域。对于较大的科技产品&#xff0c;可以设置特定的展台或展示区域&#xff0c;并配备合适的灯光和装饰&#xff0c;以凸显产品的重要性和独特性。…

matlab实现决策树可视化——信息增益、C4.5、基尼指数

代码&#xff1a;https://download.csdn.net/download/boyas/89074326

第十五章 Nginx

一、Nginx 1.1 Nginx 相关概念 1.1.1 正向代理 正向代理类似一个跳板机&#xff0c;代理访问外部资源。 比如我们国内访问谷歌&#xff0c;直接访问访问不到&#xff0c;我们可以通过一个正向代理服务器&#xff0c;请求发到代理服&#xff0c;代理服务器能够访问谷歌&am…

iOS开发进阶(十三):脚手架创建iOS项目

文章目录 一、前言二、xcode-select 命令三、拓展阅读 一、前言 项目初期&#xff0c;需要搭建项目基本框架&#xff0c;为此离不开辅助工具&#xff0c;即脚手架。当然&#xff0c;IDE也可以实现新建空白项目&#xff0c;但是其新建后的项目结构可能不符合预期设计&#xff0…

【论文阅读】Transformer 论文逐段精读

Transformer 论文逐段精读【论文精读】 文章目录 Transformer 论文逐段精读【论文精读】&#x1f4dd;摘要&#x1f4dc;结论&#x1f4cc;引言⏱️相关工作⭐模型Overview3.1 Encoder and Decoder Stacks3.2 Attention3.2.1 Scaled Dot-Product Attention3.3.2 Multi-head att…

如何系统地自学Python

1、如何系统地自学Python 小白的话可以快速过一下某马&#xff0c;某谷。 主要关注Python有什么集合&#xff0c;里面的集合怎么使用 然后再找一个Python爬虫实战视频&#xff0c;先跟着视频敲一遍代码&#xff0c;然后再尝试自己做一遍 然后再找一个Python服务开发视频&am…

FPGA + 图像处理 (二) RGB转YUV色域、转灰度图及仿真

前言 具体关于色域的知识就不细说了&#xff0c;简单来讲YUV中Y通道可以理解为就是图像的灰度图&#xff0c;因此&#xff0c;将RGB转化为YUV是求彩色图的灰度直方图、进行二值化操作等的基础。 HDMI时序生成模块 这里先介绍一下仿真时用于生成HDMI时序&#xff0c;用这个时…

Flutter 开发学习笔记(4):widget布局容器学习

文章目录 前言相关链接Widget 有状态和无状态Flutter 代码风格去掉烦人的括号后缀提示代码缩进 Flutter 布局最简单的布局widgets和Material widgets Dark语法习惯Flutter 布局默认布局Center居中Padding 填充Align对齐默认居中顶部底部右上角 通用 WidgetContainer处于性能原因…

波奇学Linux:tcp滑动窗口

连接建立成功和上层有没有accept没有关系 listen的第一个参数为1&#xff0c;建立的连接数量为2 操作系统底层用队列来管理建立的连接&#xff0c;上层用accept来获取链接 blacklog1 表示底层已经建立好的连接队列的最大长度 超过最大长度的连接&#xff0c;服务端不会丢弃…

STM32CubeMX配置步骤详解零 —— 引言

引子 初识 笔者接触STM32系列MCU有些年头了。初次接触是2015年&#xff0c;那时是在第二空间&#xff08;北京&#xff09;科技有限公司上班&#xff0c;是以STM32F407&#xff08;后缀好像是RGT6或ZGT6&#xff0c;记得不是很清楚了&#xff09;为主芯片做VR头戴式设备&…

SpringBoot整合Activiti7——实战之出差流程(分支)

文章目录 代码实现部署流程启动流程查询任务填写出差审批单经理审批xml文件 出差流程&#xff1a;开始 - 填写出差表单 - 判断&#xff08;出差天数大于等于5&#xff09;- 副经理审批 - 否则总经理审批 - 完成 代码实现 部署流程 Testpublic void testDeployProcess() throws …

物联网实战--入门篇之(九)安卓QT--开发框架

目录 一、QT简介 二、开发环境 三、编码风格 四、设计框架 五、总结 一、QT简介 QT是一款以C为基础的开发工具&#xff0c;已经包含了很多常用的库&#xff0c;除了基本的GUI以外&#xff0c;还有网络、数据库、多媒体、进程通信、串口、蓝牙等常用库&#xff0c;开发起来…