spark案例----精准搜索需求

spark案例----精准搜索需求

数据:

{"recordMap":{"screenwriter":"","publishtime":"2021-08-21","year":"2021","score":"0.0"},"processDate":"2021-11-03","cid":"c370201","itemId":"7232742","utctime":"1635935657824","useMap":{"actor":"","area":"中国","tags":"动画","language":"国语","director":"","category":"电视剧"},"itemName":"斗罗大陆1 第十部分","stbid":"004601000001004003d400692d45007a"}
{"recordMap":{"screenwriter":"金城哲夫|tetsuo kinjô|佐佐木守|关泽新一|tatsuo miyata","publishtime":"1966-07-17","year":"1966","score":"8.6"},"processDate":"2021-11-03","cid":"c370201","itemId":"6201446","utctime":"1635934986456","useMap":{"actor":"小林昭二|黒部进|石井伊吉|黑部进|sandayuu dokumamushi","area":"日本","tags":"剧情|科幻|经典|动画|动作","language":"日语","director":"圆谷英二|实相寺昭雄|圆谷一|饭岛敏宏|满田穧","category":"电视剧"},"itemName":"奥特曼","stbid":"004603000003207021057c5259c7970e"}
.......等等

需求:

数据整理

1、精准搜索数据 -- json格式

每一条数据代表的含义:一个用户什么时间观看的某一步影片,以及影片的信息

数据格式

一级字段名 二级字段名 字段类型 字段描述
recordMap/影片信息 screenwriter String 编剧
recordMap/影片信息 publishtime String 发布时间
recordMap/影片信息 year String 年代
recordMap/影片信息 score Strnig 评分
processDate String 数据处理时间
cid String 用户行为id
itemId String 影片编号
itemName String 影片名
stbid String 用户编号
utctime String 用户行为时间戳
useMap/影片信息 actor String 演员
useMap/影片信息 area String 地区
useMap/影片信息 tags String 一级标签
useMap/影片信息 language String 语言
useMap/影片信息 director String 导演
useMap/影片信息 category String 类型

使用spark处理数据

1、统计每个年代观影次数,年代取year

· 输出结果

年代 观看次数 排名
1991 1000 1
2001 222 2
1950 111 3

2、统计每种tag观看影片的次数,tags有多种

· 输出结果

tag 观看次数 排名
喜剧 1000 1
冒险 222 2
冒险 111 3

假如说以后遇到数据很长又很复杂,看不懂的情况

可以从数据中抽一条数据出来,然后在IDEA中新建一个文件File(本题中新建一个以 .json 结尾的文件),然后对数据进行格式化

将抽出的数据放到刚刚新建的文件中,然后在最上方工具栏中点击 Code --> Reformat Code 或者 Ctrl + Alt + L 将数据格式化。

1、统计每个年代观影次数,年代取year

2、统计每种tag观看影片的次数,tags有多种

package com.shujia.sql

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.{DataFrame, SparkSession}

object Demo11Year {
  def main(args: Array[String]): Unit = {

    val spark: SparkSession = SparkSession
      .builder()
      .master("local")
      .appName("year")
      .config("spark.sql.shuffle.partitions", 1)
      .getOrCreate()

    import spark.implicits._
    import org.apache.spark.sql.functions._

    val data: DataFrame = spark
      .read
      .format("json")
      .load("data/精准搜索.txt")
    
    //优化
    data.cache()
    
    //先看一下数据的大致格式
    data.printSchema()
    data.show()

    /**
      * 统计每个年代观影次数,年代取year
      */
    data
      //读取年代
      .select($"recordMap.year" as "year")
      //过滤为空的年代
      .where($"year".isNotNull && $"year" =!= "")
      //统计年代观影次数
      .groupBy($"year")
      .agg(count($"year") as "num")
      //增加排名
      .withColumn("r", row_number() over Window.orderBy($"num".desc))
      .show(1000)

    /**
      * 2、统计每种tag观看影片的次数,tags有多种
      */

    data
      //取出标签,将数据展开
      .select(explode(split($"useMap.tags", "\\|")) as "tag")
      //过滤数据
      .where($"tag".isNotNull && $"tag" =!= "")
      .groupBy($"tag")
      .agg(count($"tag") as "num")
      .withColumn("r", row_number() over Window.orderBy($"num".desc))
      .show()

  }
}
posted @ 2022-03-23 15:16  阿伟宝座  阅读(53)  评论(0)    收藏  举报