Advertisement

2022年全国各省地级市GDP均值(除港澳台及直辖市)数据可视化实战

阅读量:

导航

【一

一、环境配置

linux环境

复制代码
    java -version
    # java version "1.8.0_391"
    # Java(TM) SE Runtime Environment (build 1.8.0_391-b13)
    # Java HotSpot(TM) 64-Bit Server VM (build 25.391-b13, mixed mode)
    mysql --version
    # mysql  Ver 8.0.35 for Linux on x86_64 (MySQL Community Server - GPL)
    ls -l /opt
    # 总用量 8
    # drwxr-xr-x  28 root  root 4096 1月  27 00:48 anaconda3
    # drwxr-xr-x  11 root  root  227 1月  26 19:23 hadoop-3.3.6
    # drwxr-xr-x   5 root  root  114 2月  12 12:35 hadoop-snappy-master
    # drwxr-xr-x  10 root  root  205 2月  12 18:53 hive-3.1.3
    # drwxr-xr-x   6 root  root   99 2月  12 12:23 maven-3.9.6
    # drwxr-xr-x   6 60692 5000 4096 2月  12 12:21 snappy-1.1.1
    # drwxrwxrwx  15 root  root  235 2月   7 20:40 spark-3.5.0
    # drwxrwxrwx.  4 root  root   32 2月  11 22:19 tmp
    hdfs dfs -ls /
    # Found 3 items
    # drwxrwxrwx   - root supergroup          0 2024-02-21 13:48 /sparklog
    # drwxrwxrwx   - root supergroup          0 2024-02-17 01:28 /tmp
    # drwxrwxrwx   - root supergroup          0 2024-02-17 01:04 /user
    
    
    bash
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/mF3l2wGp6Q9APjgb5oK0eitVWJRL.png)

conda创建并激活虚拟环境

复制代码
    conda create -n pyspark python=3.*.*
    conda activate pyspark
    
    
    bash

python导包

复制代码
    import re
    import time
    import requests
    import pandas as pd
    from tqdm import tqdm
    from lxml import etree
    from pyhive import hive
    from pyspark.sql import SparkSession
    from pyecharts import charts
    from pyecharts import options as opts
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/hzvSDAofBGcp7XWKwIeJFmu9ZTQr.png)
二、获取数据

指定目标网页地址:https://www.hongheiku.com/category/gdjsgdp
收集伪装头信息:{'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'}
利用requests库搭建GET请求以获取单一网页的HTML内容
借助XPath解析器分析HTML标签中的省份、GDP列表以及总页数整数值数据
借助pandas库将列表形式的数据转换为DataFrame结构

复制代码
    # 获取单页数据
    def get_page_data(page):
    urls = {
        'page=1':'https://www.hongheiku.com/category/gdjsgdp',
        'page>1':'https://www.hongheiku.com/category/gdjsgdp/page/{}'.format(page)}
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'}
    url = urls['page=1'] if page==1 else urls['page>1']
    response = requests.get(url=url,headers=headers)
    if response.status_code != 200:
        return response.status_code
    if response.status_code == 200:
        text = response.text
    # with open('data.html','w',encoding='utf-8') as file:
    #     file.write(text)
    # with open('data.html','r',encoding='utf-8') as file:
    #     text = file.read()
    element = etree.HTML(text)
    id = element.xpath('//tr[@class="even"]/td[@class="column-1"]//center//text()')
    pro = element.xpath('//tr[@class="even"]/td[@class="column-2"]//center//text()')
    gdp = element.xpath('//tr[@class="even"]/td[@class="column-3"]//center//text()')
    year = element.xpath('//tr[@class="even"]/td[@class="column-4"]//center//text()')
    df = pd.DataFrame({
        'id':id,
        'pro':pro,
        'gdp':gdp,
        'year':year})
    pages = ''.join(element.xpath('//div[@class="pagination pagination-multi"]//span/text()'))
    pages = int(''.join(re.findall('共 ([0-9]) 页',pages)))
    time.sleep(1)
    return df,pages
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/ZrP3ObcvIumdtQ8R9q5yzxTU6jWM.png)

循环调用get_page_data函数获取所有页数据。

复制代码
    # 获取全部数据
    def get_data():
    df,pages = get_page_data(1)
    for i in tqdm(range(2,pages+1,1)):
        dfi,pages = get_page_data(i)
        df = pd.concat([df,dfi])
    df.to_csv('data.csv',encoding='utf-8',index=None)
    
    
    python
三、清洗数据

筛选出对应于2022年的数据

复制代码
    # 清洗数据
    def clean_data(file_path):
    df = pd.read_csv(file_path,encoding='utf-8',dtype=str)
    df = df[df['year'] == '2022']
    df['gdp'] = list(map(lambda x:float(str(x).rstrip('亿')),df['gdp']))
    dict0 = {
        '重庆':'重庆市','北京':'北京市','天津':'天津市','上海':'上海市',
        '香港':'香港特别行政区','澳门':'澳门特别行政区',
        '内蒙古':'内蒙古自治区','西藏':'西藏自治区',
        '新疆':'新疆维吾尔自治区','宁夏':'宁夏回族自治区','广西':'广西壮族自治区'}
    df['pro'] = list(map(
        lambda x:str(x).lstrip('[').partition(']')[0],df['pro']))
    df['pro'] = list(map(
        lambda x:dict0[x] if x in dict0.keys() else x +'省',df['pro']))
    return df
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/JfPTOiqKgZ1a6p5HUoX0IeVFk7r2.png)
四、聚合数据

按照省份对GDP进行求平均聚合。
对省平均GDP统一保留两位小数。

复制代码
    # 聚合数据
    def work_data(df:pd.DataFrame):
    df = df.groupby(['pro']).mean('gdp').reset_index().sort_values('gdp',ascending=False)
    df.index = range(df.shape[0])
    df['gdp'] = list(map(lambda x:round(x,2),df['gdp']))
    return df
    
    
    python
五、上传数据

启动伪分布式集群代码。

复制代码
    start-all.sh
    mr-jobhistory-daemon.sh start historyserver
    /opt/spark-3.5.0/sbin/start-all.sh
    /opt/spark-3.5.0/sbin/start-history-server.sh
    nohup hive --service metastore &
    
    
    bash

检测metastore(hive)端口是否启动成功。

复制代码
    netstat -anp|grep 9083
    # tcp6    0    0 :::9083     :::*    LISTEN    9919/java
    
    
    bash

hive编写sql创建数据库。

复制代码
    create database myproject;
    
    
    sql

pyspark上传数据到metastore。

复制代码
    # 上传数据
    def upload_data(df:pd.DataFrame):
    global spark
    spark = SparkSession.Builder(
    ).appName('test').master('local[*]')\
        .config('spark.sql.shuffle.partitions','2')\
        .config('spark.sql.warehouse.dir','hdfs://ml:9000/user/hive/warehouse')\
        .config('hive.metastore.uris','thrift://ml:9083'
        ).enableHiveSupport().getOrCreate()
    df = spark.createDataFrame(df)
    spark.sql('drop table if exists myproject.data;')
    df.write.mode('overwrite').saveAsTable('myproject.data','parquet')
    df.show()
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/dSI2kWeUqmALlG3spQcEfB7xRzTo.png)

编写标准入口函数。

复制代码
    # 入口函数
    def main():
    try:
        get_data()
    except:
        print(get_data())
    df = clean_data('data.csv')
    df = work_data(df)
    upload_data(df)
    if __name__ == '__main__':
    main()
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/MNS5hOnWpc4JFDERYQ37rHIv69Lm.png)

上传代码到linux系统。

复制代码
    scp data.py root@ml:/root/ml/data.py
    
    
    powershell

linuxpython代码。

复制代码
    cd /root/ml
    /opt/anaconda3/envs/pyspark/bin/python /root/ml/data.py
    
    
    bash

该系统将在hdfs文件系统/user/hive/warehouse/myproject.db/data目录下生成一个以snappy压缩格式存储的列式结构parquet文件part-00000-*.snappy.parquet。

六、数据端口

开启thrift数据端口。

复制代码
    /opt/spark-3.5.0/sbin/start-thriftserver.sh \
    --hiveconf hiveserver2.thrift.port=10000 \
    --hiveconf hiveserver2.thrift.bind.host=ml \
    --master local[*]
    
    
    bash

检测数据端口状态

复制代码
    netstat -anp|grep 10000
    tcp6    0    0 :::10000    :::*    LISTEN    10555/java
    
    
    bash
七、下载数据

利用PyHive工具编写规范化的JDBC连接代码,与metastore中的Hive引擎建立连接以获取数据库引擎对象。使用Pandas库解析Spark SQL查询语句并提取数据。

复制代码
    def download_data():
    engine = hive.Connection(
        host='ml',port=10000,database='myproject',
        username='root',password='ml123456',auth="LDAP")
    df = pd.read_sql_query(
        'select * from myproject.data;',con=engine)
    df = df.astype({'pro':str,'gdp':float})
    return df
    df = download_data()
    df
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/mpwgaSGifD9vy2QdUk06jOTY7hxN.png)
八、数据可视化

通过pyecharts的Map对象对数据进行可视化输出

复制代码
    def get_chart(df:pd.DataFrame):
    pro = list(df['pro'])
    gdp = list(df['gdp'])
    # 构建包含省份和GDP的列表
    List = [i for i in zip(pro, gdp)]
    # 使用pyecharts创建地图
    myMap = charts.Map()
    myMap.add(
        "2022年全国各省地级市GDP均值(除港澳台及直辖市)", List, maptype='china', is_map_symbol_show=False)
    # 全局配置
    myMap.set_global_opts(
        title_opts=opts.TitleOpts(is_show=True,title='2022年全国各省GDP均值(单位:亿)'),
        visualmap_opts=opts.VisualMapOpts(
            is_show=True,min_=0,max_=max(gdp),split_number=4,is_piecewise=True),
        toolbox_opts=opts.ToolboxOpts(is_show=True))
    # 系列配置
    myMap.set_series_opts(
        textstyle_opts=opts.TextStyleOpts(font_size=20),
        label_opts=opts.LabelOpts(font_size=7))
    # # 生成地图HTML文件
    # myMap.render('data.html')
    return myMap
    myMap = get_chart(df)
    # jupyter-notebook展示
    myMap.render_notebook()
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/26mXI4kdP7lbfH90Aq3G1aMVuoTe.png)

全部评论 (0)

还没有任何评论哟~