电影评分数据分析案例-Spark SQL

python 复制代码
# cording:utf8

from pyspark.sql import SparkSession
from pyspark.sql.types import IntegerType, StringType, StructType
import pyspark.sql.functions as F

if __name__ == '__main__':
    # 0.构建执行环境入口对象SparkSession
    spark = SparkSession.builder.\
        appName('movie_demo').\
        master('local[*]').\
        getOrCreate()

    sc = spark.sparkContext

    # 1.读取文件
    schema = StructType().add('user_id', StringType(), nullable=True). \
        add('movie_id', IntegerType(), nullable=True).\
        add('rank', IntegerType(), nullable=True).\
        add('ts', StringType(), nullable=True)

    df = spark.read.format('csv').\
        option('sep', '\t').\
        option('header', False).\
        option('encoding', 'utf-8').\
        schema(schema=schema).\
        load('../input/u.data')

    # TODO 1:用户平均分
    df.groupBy('user_id').\
        avg('rank').\
        withColumnRenamed('avg(rank)', 'avg_rank').\
        withColumn('avg_rank', F.round('avg_rank', 2)).\
        orderBy('avg_rank', ascending=False).\
        show()

    # TODO 2:电影的平均分查询
    df.createTempView('movie')
    spark.sql('''
        SELECT movie_id, ROUND(AVG(rank),2) as avg_rank FROM movie GROUP BY movie_id ORDER BY avg_rank DESC
    ''').show()

    # TODO 3:查询大于平均分的电影数量
    print('大于平均分电影数量为:', df.where(df['rank'] > df.select(F.avg('rank')).first()['avg(rank)']).count())

    # TODO 4:查询高分电影中(>3)打分次数最多的用户,此人打分的平均分
    # 找出打分次数最多的人
    user_id = df.where('rank>3').\
        groupBy('user_id').\
        count(). \
        withColumnRenamed('count', 'cnt').\
        orderBy('cnt', ascennding=False).\
        limit(1).\
        first()['user_id']
    # 算平均分
    df.filter(df['user_id'] == user_id).\
        select(F.round(F.avg('rank'), 2)).show()

    # TODO 5: 查询每个用户的平均分打分,最低打分,最高打分
    df.groupBy('user_id').\
        agg(
        F.round(F.avg('rank'), 2).alias('avg_rank'),
        F.min('rank').alias('min_rank'),
        F.max('rank').alias('max_rank')
    ).show()

    # TODO 6:查询评分超过100次的电影的平均分 排名TOP10
    df.groupBy('movie_id').\
        agg(
        F.round(F.count('movie_id'),2).alias('cnt'),
        F.round(F.avg('rank'),2).alias('avg_rank')
        ).\
        where('cnt > 100').\
        orderBy('avg_rank', ascending=False).\
        limit(10).\
        show()

'''
1.agg:它是GroupedData对象的API,作用是:在里面可以写多个聚合
2.alias:它是Column对象的API,可以针对一个列进行改名
3.withColumnRenamed:它是DataFrame的API,可以对DF中的列进行改名,一次改一个列,改多个列可以链式调用
4.orderBy:DataFrame的API,进行排序,参数1是被排序的列,参数2是 升序(True)或降序(False)
5.first:DataFrame的API,取出DF的第一行数据,返回值结果是Row对象
## Row对象:就是一个数组,可以通过row['列名']来取出当前行中,某一列具体数值,返回值不再是DF 或者GroupedData 或者Column 而是具体的值(字符串、数字等)
'''

1.

相关推荐
l1t22 分钟前
利用DeepSeek辅助翻译clickhouse SQL为DuckDB 格式求解Advent of Code 2025第10题 电子工厂 第二部分
数据库·人工智能·sql·clickhouse·duckdb
DarkAthena26 分钟前
【GaussDB】分析函数性能优化案例-row_number改写
数据库·sql·oracle·性能优化·gaussdb
踢足球092939 分钟前
寒假打卡:2026-01-21
数据库·sql
麦聪聊数据1 小时前
基于SQL+CDC构建MySQL到ClickHouse的实时链路
sql·mysql·clickhouse
IT大白1 小时前
6、数据库优化
数据库·sql
Thomas21431 小时前
spark view永久保存 + paimon对应的view
大数据·分布式·spark
q_35488851531 小时前
机器学习:python共享单车数据分析系统 可视化 Flask框架 单车数据 骑行数据 大数据 机器学习 计算机毕业设计✅
人工智能·python·机器学习·数据分析·flask·推荐算法·共享单车
sg_knight2 小时前
SQL 中的 IFNULL 函数是什么?
数据库·sql·mysql·oracle·database·关系型数据库·db
徐先生 @_@|||2 小时前
大数据技术演进(从传统Hadoop到Spark到云原生的技术演进路径)
大数据·hadoop·spark
叫我:松哥2 小时前
基于Flask的心理健康咨询管理与智能分析,集成AI智能对话咨询、心理测评(PHQ-9抑郁量表/GAD-7焦虑量表)、情绪追踪记录、危机预警识别
大数据·人工智能·python·机器学习·信息可视化·数据分析·flask