关于#mapreduce#的问题,如何解决?


mapreduce+mysql+python分析豆瓣读书top250,还要画图,想问下python的逻辑代码怎么写,就比如,找出当前评价人数最多的前100的小说,并以国籍为指标绘制饼状图,逻辑代码类似于这样要连接数据库,还有个run.py的启动文件

img

 


这里是一个简单的思路:
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()):  
            # 这里对结果进行处理和绘制饼图
这是一个简单的思路,希望对您有所帮助。如果有任何问题,欢迎交流。
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    首先,我们需要爬取豆瓣读书Top250的数据,并将数据存储到MySQL数据库中。我们可以使用Python爬虫框架Scrapy来爬取数据,然后使用PyMySQL来连接MySQL数据库并插入数据。以下是Scrapy爬虫的基本结构:

    1. 创建新的Scrapy项目:
    scrapy startproject douban
    
    1. 创建爬虫模板:
    scrapy genspider douban_book_spider book.douban.com
    
    1. 在爬虫模板文件中添加爬取逻辑:
    def parse(self, response):
        book_list = response.xpath('//div[@class="article"]/div[@class="indent"]/table')
        for book in book_list:
            title = book.xpath('.//div[@class="pl2"]/a/@title').extract_first()
            rating = book.xpath('.//div[@class="star"]/span[@class="rating_num"]/text()').extract_first()
            # 省略其他字段
            yield {
                "title": title,
                "rating": rating,
                # 省略其他字段
            }
    
    1. 连接MySQL数据库并插入数据:
    import pymysql
    
    conn = pymysql.connect(host='localhost', user='root', password='password', db='douban')
    cursor = conn.cursor()
    for item in items:
        sql = "INSERT INTO book (title, rating) VALUES (%s, %s)"
        cursor.execute(sql, (item['title'], item['rating']))
    conn.commit()
    conn.close()
    

    接下来,我们需要编写Python代码来分析数据并生成饼状图。我们可以使用Pandas和Matplotlib这两个常用的数据处理和可视化库。以下是实现逻辑:

    1. 连接MySQL数据库并读取数据:
    import pandas as pd
    import pymysql
    
    conn = pymysql.connect(host='localhost', user='root', password='password', db='douban')
    df = pd.read_sql("SELECT * FROM book", conn)
    conn.close()
    
    1. 计算评价人数最多的前100本小说:
    df = df.sort_values(by='rating_num', ascending=False).head(100)
    
    1. 统计不同国籍的作家的图书数量:
    country_count = df.groupby('author_nationality').size()
    
    1. 绘制饼状图:
    import matplotlib.pyplot as plt
    
    labels = country_count.index.tolist()
    sizes = country_count.tolist()
    plt.pie(sizes, labels=labels, autopct='%1.1f%%')
    plt.axis('equal')
    plt.show()
    

    最后,我们需要在命令行中运行Python代码,如下所示:

    python analysis.py
    

    其中,analysis.py是我们编写的Python逻辑代码文件。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^