mapreduce+mysql+python分析豆瓣读书top250,还要画图,想问下python的逻辑代码怎么写,就比如,找出当前评价人数最多的前100的小说,并以国籍为指标绘制饼状图,逻辑代码类似于这样要连接数据库,还有个run.py的启动文件
mapreduce+mysql+python分析豆瓣读书top250,还要画图,想问下python的逻辑代码怎么写,就比如,找出当前评价人数最多的前100的小说,并以国籍为指标绘制饼状图,逻辑代码类似于这样要连接数据库,还有个run.py的启动文件
这里是一个简单的思路:
1. 连接MySQL数据库,查询出豆瓣读书top250的数据,包括书名、评分、评价人数、国籍等信息。
2. 在Map阶段,将每本书的信息映射为((国籍, 书名), 评价人数)这样的键值对。
3. 在Reduce阶段,对相同国籍的书进行评价人数的累加,得到((国籍, 总评价人数), [书名1, 书名2, ...])这样的结果。
4. 对Reduce结果再进行排序,选出评价人数最多的前100本书。
5. 根据国籍信息绘制饼图。
python代码如下:
python
import mysql.connector
from mrjob.job import MRJob
class BookTop250(MRJob):
def mapper(self, _, line):
line = line.strip().split('\t')
name, rating, votes, nationality = line[0], line[1], int(line[3]), line[6]
yield (nationality, name), votes
def reducer(self, key, values):
total_votes = sum(values)
book_names = [v for v in values]
yield key, (total_votes, book_names)
if __name__ == '__main__':
# 连接MySQL,查询top250数据
conn = mysql.connector.connect(host='localhost', user='root', password='password', database='douban')
cursor = conn.cursor()
cursor.execute('SELECT * FROM book_top250')
rows = cursor.fetchall()
# 写入本地数据文件
with open('top250.txt', 'w') as f:
for row in rows:
f.write('\t'.join(row) + '\n')
# 运行MapReduce作业
mr_job = BookTop250(args=['top250.txt'])
with mr_job.make_runner() as runner:
runner.run()
for key, value in mr_job.parse_output(runner.cat_output()):
# 这里对结果进行处理和绘制饼图
这是一个简单的思路,希望对您有所帮助。如果有任何问题,欢迎交流。