目录
2这个项目主要建立在python连接hive基础之下的,用python里面的库做数据分析,以及python可视化(这个项目没有搞)这个项目主要是一个抛砖引玉的模式,
1:Climbing_data.py文件(基于python爬虫爬取数据写入mysql数据库)
3:hive_dataDirect.py文件(主要是python连接hive进行数据分析,里面用到pandas这个库,没有搞python可视化)
2:main.py文件(主要是执行主文件,主要是调用codes文件夹下面的py文件来执行,都是有些linux代码还是要自己在服务器端敲,这里是要优化的)
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()