基于python爬虫,hadoop,mysql,hive,sqoop一个可以优化的项目

目录

1项目目录

2这个项目主要建立在python连接hive基础之下的,用python里面的库做数据分析,以及python可视化(这个项目没有搞)这个项目主要是一个抛砖引玉的模式,

3项目代码

1:codes文件下面的py文件

  1:Climbing_data.py文件(基于python爬虫爬取数据写入mysql数据库)

2:FDFS_data_hive.py文件(python连接hive,并且把FDFS上面数据导入hive里面,其实这里我无法有python去执行从mysql导数据到HDFS上面,这里其实也是一个优化对象)

3:hive_dataDirect.py文件(主要是python连接hive进行数据分析,里面用到pandas这个库,没有搞python可视化)

2:main.py文件(主要是执行主文件,主要是调用codes文件夹下面的py文件来执行,都是有些linux代码还是要自己在服务器端敲,这里是要优化的)

4关于sqoop的介绍:sqoop介绍

     简单的说就是搞数据迁移的


1项目目录

    

2这个项目主要建立在python连接hive基础之下的,用python里面的库做数据分析,以及python可视化(这个项目没有搞)这个项目主要是一个抛砖引玉的模式,

3项目代码

1:codes文件下面的py文件

  1:Climbing_data.py文件(基于python爬虫爬取数据写入mysql数据库)

import json
import requests
import pymysql
import time

# 爬数据到mysql数据库模块

def get_data():  #爬数据

    url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=330&page_start=0'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36'
    }
    json_data = requests.get(url, headers=headers)
    data = json_data.text
    json_data = json.loads(data)
    subjects = json_data['subjects']
    result = []
    for movie in subjects:
        row = {
            'movie_rate': movie['rate'],
            'movie_name': movie['title'],
            'movie_url': movie['url']
        }
        result.append(row)
    return result


def data():  #创建mysql库和mysql表
    import pymysql

    conn = pymysql.connect(host='master', user='root', password='123456')
    # 创建游标
    cursor = conn.cursor()
    # 创建数据库的sql(使用if判断是否已经存在数据库,数据库不存在时才会创建,否则会报错)
    sql0 = "create database if not exists db1"
    sql1 = '''
         use db1
    '''
    sql2 = '''
         create table tb1(
                            id int primary key auto_increment,
                            movie_rate double,
                            movie_name varchar(200),
                            movie_url varchar(200)
    ) engine=Innodb charset utf8;
    
    '''

    # 执行创建数据库的sql语句
    cursor.execute(sql0)
    cursor.execute(sql1)
    cursor.execute(sql2)


def sava_data(data):  #把数据写入mysql数据库里面
    config = {
        'host': 'master',  # 你的主机名  如果是在本机是就是 localhost
        'port': 3306,  # 不要更改
        'user': 'root',  # 你mysql数据库用户名
        'password': '123456',  # 你mysql数据库密码
        'database': 'db1',  # 不要更改
        'charset': 'utf8'  # 不要更改
    }
    conn = pymysql.connect(**config)
    cursor = conn.cursor()

    sql = '''
        insert into  tb1
            (movie_rate, movie_name, movie_url)
        values 
            (%(movie_rate)s,%(movie_name)s,%(movie_url)s)
    '''
    cursor.executemany(sql, data)
    conn.commit()
    cursor.close()
    conn.close()

2:FDFS_data_hive.py文件(python连接hive,并且把FDFS上面数据导入hive里面,其实这里我无法有python去执行从mysql导数据到HDFS上面,这里其实也是一个优化对象)

from impala.dbapi import connect


def FDFS_hive():  # 从FDFS上导数据到hive

    conn = connect(host='master', port=10000, auth_mechanism='PLAIN')

    cur = conn.cursor()

    # 创建db1数据库
    try:
        cur.execute('CREATE DATABASE IF NOT EXISTS db1')
    except:
        print("db1数据库创建失败")

    # 在db1数据库里面创建tb1表
    try:
        cur.execute(
            "create table if not exists db1.tb1 (id int,movie_rate double,movie_name varchar(200),movie_url varchar(200))row format delimited fields terminated by ','")
    except:
        print('tb1表创建失败')

    # 从HDFS导入数据到Hive表 (hadoop fs -chmod -R 777 / 添加权限每次导数据都要搞)

    try:
        for i in range(0,4):
            cur.execute(f'load data inpath "/mydata/part-m-0000{i}" into table db1.tb1')
            print(f"数据{i}成功从FDFS导到hive")
    except:
       print("导数据失败(可能没有执行 hadoop fs -chmod -R 777 /)")

    # 关闭连接
    cur.close()
    conn.close()

3:hive_dataDirect.py文件(主要是python连接hive进行数据分析,里面用到pandas这个库,没有搞python可视化)

from impala.dbapi import connect
import pandas as pd
import time


# 数据分析模块

def direct():
    start = time.time()

    conn = connect(host='master', port=10000, database='db1', auth_mechanism='PLAIN')
    cur = conn.cursor()

    # 1 统计一共有多少电影
    cur.execute('select count(distinct movie_name) from db1.tb1')
    movie_num = (cur.fetchall())[0][0]  # 电影总数
    print("爬取电影总数:", movie_num)

    # 2 统计当前爬取的电影评分区间
    cur.execute('select movie_rate from db1.tb1 where movie_rate=(select max(movie_rate)from db1.tb1)')
    movie_max = (cur.fetchall())[0][0]
    # print("电影评分最大值:",movie_max)
    cur.execute('select movie_rate from db1.tb1 where movie_rate=(select min(movie_rate)from db1.tb1)')
    movie_min = (cur.fetchall())[0][0]
    # print("电影评分最小值:",movie_min)
    print(f"电影评分区间:", movie_max, '~', movie_min)

    # 3 提取拍名前12的电影名称和网站
    cur.execute(
        'select movie_rate,movie_name,movie_url from (select * ,rank() over (order by movie_rate desc )rn from db1.tb1)tmp  where rn<=9')
    df = pd.DataFrame(cur.fetchall(), columns=['评分', '电影名', '网站'])
    print('排名前12电影:', df)

    # 4 提取拍名后10的电影名称
    cur.execute(
        'select movie_rate,movie_name,movie_url from (select * ,rank() over (order by movie_rate )rn from db1.tb1)tmp  where rn<=10')
    df = pd.DataFrame(cur.fetchall(), columns=['评分', '电影名', '网站'])
    print('排名后10的电影', df)

    # 5 提取每个评分占总评分的百分比和个数
    cur.execute(
        'select movie_rate,count(movie_rate),count(movie_rate)/(select count(distinct movie_rate)from db1.tb1)from db1.tb1 group by movie_rate')
    df = pd.DataFrame(cur.fetchall(), columns=['评分', '个数', '占比'])
    print('评分占总评分的百分比和个数:', df)

    a = (time.time() - start)
    m, s = divmod(a, 60)
    h, m = divmod(m, 60)
    print("耗时:", "%02d:%02d:%02d" % (h, m, s))



    # 6 提供一个查看电影模块 其实还可以优化,
    inpt = input("请输入你要查看的电影名字(输入模式'电影名'):")
    cur.execute('select movie_name from db1.tb1')
    cur.execute(
        f'select * from db1.tb1 where movie_name={inpt}'
    )
    print(f'{inpt}电影信息:', cur.fetchall())

    # 关闭连接
    cur.close()
    conn.close()



2:main.py文件(主要是执行主文件,主要是调用codes文件夹下面的py文件来执行,都是有些linux代码还是要自己在服务器端敲,这里是要优化的)

from codes.Climbing_data import *
from codes.FDFS_data_hive import *
from codes.hive_dataDirect import *

if __name__ == '__main__':
    avg0 = '''
          1:装环境
          2:爬数据到mysql数据库
          3:把mysql数据库里面数据导到HDFS上
          4:把HDFS上面数据导到hive里面  
          5:对爬取的数据(hive)进行数据分析 
    '''
    avg1 = ('''
          装环境方法:
              装环境:hadoop mysql hive sqoop 
              可以访问:https://blog.csdn.net/m0_73905064?spm=1000.2115.3001.5343
                   1:启动hadoop start-all.sh
                   2:启动hive:
                          nohup /export/hive/bin/hive --service metastore &
                          nohup /export/hive/bin/hive --service hiveserver2 &
    ''')
    avg2='''
        在服务器输入:
           sqoop import --connect jdbc:mysql://master:3306/db1 --username root --password 123456 --table tb1 --target-dir /mydata
           hadoop fs -chmod -R 777 /
    '''
    while True:
        print(avg0)
        while 1:
            imp = int(input("请输入代码:"))
            if imp == 1:
                print(avg1)
                imp = input("这个模块完成了吗(输入'完成'进行下一步):")
                if imp == '完成':
                    break
            elif imp == 2:
                start = time.time()
                data()  # 创建mysql数据库和表
                sava_data(get_data())  # 把爬取的数据导入mysql数据库里面
                time.sleep(5)
                a = (time.time() - start)
                m, s = divmod(a, 60)
                h, m = divmod(m, 60)
                print("爬数据到mysql数据库耗时:", "%02d:%02d:%02d" % (h, m, s))
            elif imp ==3:
                print(avg2)
            elif imp == 4:
                start = time.time()
                FDFS_hive()     #
                time.sleep(5)
                a = (time.time() - start)
                m, s = divmod(a, 60)
                h, m = divmod(m, 60)
                print("从HDFS导数据到hive耗时:", "%02d:%02d:%02d" % (h, m, s))
            elif imp == 5:
                direct()



4关于sqoop的介绍:sqoop介绍

     简单的说就是搞数据迁移的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值