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()
}
}

浙公网安备 33010602011771号