0


Apache Spark 练习五:使用Spark进行YouTube视频网站指标分析

一、源数据

本章所分析的数据来自于Simon Fraser大学公开的YouTube视频网站的视频数据(https://netsg.cs.sfu.ca/youtubedata/)。数据包含两张表。第一张为视频表,记录了研究人员爬取的视频的元数据信息,具体包括以下字段:
字段备注详细描述video id视频唯一id11位字符串uploader视频上传者上传视频的用户名Stringage视频年龄视频在平台上的整数天category视频类别上传视频指定的视频分类length视频长度整形数字标识的视频长度views观看次数视频被浏览的次数rate视频评分满分5分ratings流量视频的流量,整型数字conments评论数一个视频的整数评论数related ids相关视频id相关视频的id,最多20个
第二张表为用户表,记录了爬取的YouTube用户的相关信息,具体包括:
字段备注字段类型uploader上传者用户名stringvideos上传视频数intfriends朋友数量int

二、练习题

0. 数据预处理

本章所分析的视频信息下载自http://netsg.cs.sfu.ca/youtubedata/080327.zip,我们将该压缩包中的所有文件进行了归并,并过滤掉那些字段数不足10个的记录。此外,我们将category字段的数据进行了预处理,将所有的类别用&分割,同时去掉两边空格。并且,多个相关视频id也使用&进行分割。用户信息则下载自https://netsg.cs.sfu.ca/youtubedata/080903user.zip。然后,我们将这些数据读取为Spark DataFrame形式,以供后续分析。

  1. val spark = SparkSession
  2. .builder()
  3. .appName("Youtube")
  4. .getOrCreate()
  5. import spark.implicits._
  6. /* 加载源数据 */
  7. // 源数据下载自 https://netsg.cs.sfu.ca/youtubedata/
  8. // 加载视频数据
  9. val videoRDD =
  10. spark.sparkContext.textFile("hdfs:///SparkLearning/youtube_video.txt")
  11. val videoSchema = StructType(
  12. Array[StructField](
  13. StructField("video_id", StringType, nullable = true),
  14. StructField("uploader", StringType, nullable = true),
  15. StructField("age", IntegerType, nullable = true),
  16. StructField("category", ArrayType(StringType), nullable = true),
  17. StructField("length", IntegerType, nullable = true),
  18. StructField("views", IntegerType, nullable = true),
  19. StructField("rate", DoubleType, nullable = true),
  20. StructField("ratings", IntegerType, nullable = true),
  21. StructField("comments", IntegerType, nullable = true),
  22. StructField("related_ids", ArrayType(StringType), nullable = true)
  23. )
  24. )
  25. val rowVideoRDD = videoRDD
  26. .map(_.split("\t"))
  27. .map(attributes =>
  28. Row(
  29. attributes(0),
  30. attributes(1),
  31. attributes(2).toInt,
  32. attributes(3).split("&"),
  33. attributes(4).toInt,
  34. attributes(5).toInt,
  35. attributes(6).toDouble,
  36. attributes(7).toInt,
  37. attributes(8).toInt,
  38. attributes(9).split("&")
  39. )
  40. )
  41. val videoDF = spark.createDataFrame(rowVideoRDD, videoSchema)
  42. // 加载用户数据
  43. val userRDD =
  44. spark.sparkContext.textFile("hdfs:///SparkLearning/youtube_user.txt")
  45. val userSchema = StructType(
  46. Array[StructField](
  47. StructField("uploader", StringType, nullable = true),
  48. StructField("videos", IntegerType, nullable = true),
  49. StructField("friends", IntegerType, nullable = true)
  50. )
  51. )
  52. val rowUserRDD = userRDD
  53. .map(_.split("\t"))
  54. .map(attributes =>
  55. Row(attributes(0), attributes(1).toInt, attributes(2).toInt)
  56. )
  57. val userDF = spark.createDataFrame(rowUserRDD, userSchema)

1. 统计视频观看数Top10

  1. val res = videoDF
  2. .select($"video_id", $"views")
  3. .orderBy($"views".desc)
  4. .limit(10)

2. 统计视频类别热度Top10

  1. val res = videoDF
  2. .select(explode($"category").as("category"))
  3. .groupBy($"category")
  4. .count()
  5. .orderBy($"count".desc)
  6. .limit(10)

3. 统计出视频观看数最高的20个视频的所属类别以及类别包含Top20视频的个数

  1. val res = videoDF
  2. .orderBy($"views".desc)
  3. .limit(20)
  4. .select(explode($"category").as("category"))
  5. .groupBy($"category")
  6. .count()

4. 统计视频观看数Top50所关联视频的所属类别Rank

  1. val res = videoDF
  2. .orderBy($"views".desc)
  3. .limit(50)
  4. .select(explode($"related_ids").as("related_id"))
  5. .alias("t1")
  6. .join(videoDF.as("t2"), $"t1.related_id" === $"t2.video_id")
  7. .select(explode($"t2.category").as("category"))
  8. .groupBy($"category")
  9. .count()
  10. .orderBy($"count".desc)

5. 统计每个类别中的视频观看数Top10

  1. val res = videoDF
  2. .select($"video_id", explode($"category").as("category"), $"views")
  3. .select(
  4. $"category",
  5. $"video_id",
  6. $"views",
  7. row_number()
  8. .over(Window.partitionBy($"category").orderBy($"views".desc))
  9. .alias("rank")
  10. )
  11. .filter($"rank" <= 10)
  12. .orderBy($"category", $"rank")

6. 统计上传视频最多的用户Top10以及他们上传的视频

  1. val res = userDF
  2. .orderBy($"videos".desc)
  3. .limit(10)
  4. .alias("t1")
  5. .join(videoDF.alias("t2"), $"t1.uploader" === $"t2.uploader")
  6. .select($"t2.uploader", $"t2.video_id")
  7. .orderBy($"uploader")
标签: 大数据 spark

本文转载自: https://blog.csdn.net/liulizhi1996/article/details/128404633
版权归原作者 liulizhi1996 所有, 如有侵权,请联系我们删除。

“Apache Spark 练习五:使用Spark进行YouTube视频网站指标分析”的评论:

还没有评论