面试 五面,Spark 案例,Java面试真题精选

//5.将品类进行排序,并且取前十名

// 点击数量排序,下单数量的排序,支付数量排序

// 元组排序:先比较第一个,在比较第二个,依次类推

// (品类ID, (点击数量,下单数量,支付数量))

//join(不可以),zip(不可以),leftOutJoin(不可以),cogroup (可以)连接数据

val cogroupRDD: RDD[(String, (Iterable[Int], Iterable[Int], Iterable[Int]))] =

clickCountRDD.cogroup(orderCountRDD, payCountRDD)

val analysisRDD = cogroupRDD.mapValues{

case (clickIter, orderIter, payIter) => {

var clickCnt = 0

val iter1 = clickIter.iterator

if (iter1.hasNext){

clickCnt = iter1.next()

}

var orderCnt = 0

val iter2 = orderIter.iterator

if (iter2.hasNext){

orderCnt = iter2.next()

}

var payCnt = 0

val iter3 = payIter.iterator

if (iter3.hasNext){

payCnt = iter3.next()

}

(clickCnt,orderCnt,payCnt)

}

}

val resultRDD: Array[(String, (Int, Int, Int))] = analysisRDD.sortBy(_._2, false).take(10)

//6.将结果采集到控制台

resultRDD.foreach(println)

sc.stop()

}

}

实现方案二

需求分析

一次性统计每个品类点击的次数,下单的次数和支付的次数:

(品类,(点击总数,下单总数,支付总数))

需求实现

package com.atguigu.bigdata.spark.core.rdd.req

import org.apache.spark.rdd.RDD

import org.apache.spark.{SparkConf, SparkContext}

object Spark02_Req1_HotCateforyTop10Analysis1 {

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

//TODO : Top热门品类

val sparkConf: SparkConf = new SparkConf().setMaster(“local[*]”).setAppName(“Spark02_Req1_HotCateforyTop10Analysis1”)

val sc = new SparkContext(sparkConf)

//Q: actionRDD重复使用

//Q:cogr性能可能较低

//1. 读取原始日志数据

val actionRDD: RDD[String] = sc.textFile(“datas/user_visit_action.txt”)

actionRDD.cache() //解决重复使用

//2. 统计品类的点击数量(品类ID,点击数量)

val clickActionRDD: RDD[String] = actionRDD.filter(

action => {

val datas: Array[String] = action.split(“_”)

datas(6) != “-1”

}

)

val clickCountRDD: RDD[(String, Int)] = clickActionRDD.map(

action => {

val datas: Array[String] = action.split(“_”)

(datas(6), 1)

}

).reduceByKey(_ + _)

//3. 统计品类的下单数量(品类ID,下单数量)

val orderActionRDD: RDD[String] = actionRDD.filter(

action => {

val datas: Array[String] = action.split(“_”)

datas(8) != “null”

}

)

val orderCountRDD: RDD[(String, Int)] = orderActionRDD.flatMap(

action => {

val datas: Array[String] = action.split(“_”)

val cid = datas(8)

val cids = cid.split(“,”)

//扁平化

cids.map(id => (id, 1))

}

).reduceByKey(_ + _)

//4. 统计品类的支付数量(品类ID,支付数量)

val payActionRDD: RDD[String] = actionRDD.filter(

action => {

val datas: Array[String] = action.split(“_”)

datas(10) != “null”

}

)

val payCountRDD: RDD[(String, Int)] = payActionRDD.flatMap(

action => {

val datas: Array[String] = action.split(“_”)

val cid = datas(10)

val cids = cid.split(“,”)

//扁平化

cids.map(id => (id, 1))

}

).reduceByKey(_ + _)

//5.将品类进行排序,并且取前十名

// 点击数量排序,下单数量的排序,支付数量排序

// 元组排序:先比较第一个,在比较第二个,依次类推

// (品类ID, (点击数量,下单数量,支付数量))

//join(不可以),zip(不可以),leftOutJoin(不可以),cogroup (可以)连接数据

//cogroup有可能存在shuffle

//换一个方式实现

(品类ID, 点击数量)=>(品类ID, (点击数量))=>(品类ID, (点击数量,0,0))

(品类ID, 下单数量)=>(品类ID, (下单数量))=>(品类ID, (0,下单数量,0))

(品类ID, 支付数量)=>(品类ID, (支付数量))=>(品类ID, (0,0,支付数量))

//之后再两两聚合

val rdd1 = clickCountRDD.map{

case (cid, cnt) => {

(cid, (cnt,0,0))

}

}

val rdd2 = orderCountRDD.map{

case (cid, cnt) => {

(cid, (0,cnt,0))

}

}

val rdd3 = payCountRDD.map{

case (cid, cnt) => {

(cid, (0,0,cnt))

}

}

//将三个数据源合并在一起,统一进行聚合计算

val sourceRDD: RDD[(String, (Int, Int, Int))] = rdd1.union(rdd2).union(rdd3)

val analysisRDD: RDD[(String, (Int, Int, Int))] = sourceRDD.reduceByKey(

(t1, t2) => {

(t1._1 + t2._1, t1._2 + t2._2, t1._3 + t2._3)

}

)

val resultRDD: Array[(String, (Int, Int, Int))] = analysisRDD.sortBy(_._2, false).take(10)

//6.将结果采集到控制台

resultRDD.foreach(println)

sc.stop()

}

}

实现方案三

需求分析

使用累加器的方式聚合数据

需求实现

package com.atguigu.bigdata.spark.core.rdd.req

import org.apache.spark.rdd.RDD

import org.apache.spark.util.AccumulatorV2

import org.apache.spark.{SparkConf, SparkContext}

import scala.collection.mutable

object Spark04_Req1_HotCateforyTop10Analysis3 {

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

//TODO : Top热门品类

val sparkConf: SparkConf = new SparkConf().setMaster(“local[*]”).setAppName(“Spark03_Req1_HotCateforyTop10Analysis2”)

val sc = new SparkContext(sparkConf)

//Q:存在shuffle操作(reduceByKey)

//使用累加器

//1. 读取原始日志数据

val actionRDD: RDD[String] = sc.textFile(“datas/user_visit_action.txt”)

val acc = new HotCategoryAccumulator

sc.register(acc,“HotCategory”)

//2. 将数据转换结构

actionRDD.foreach(

action => {

val datas: Array[String] = action.split(“_”)

if (datas(6) != “-1”) {

//点击场合

acc.add((datas(6),“click”))

} else if (datas(8) != “null”) {

//下单的场合

val ids: Array[String] = datas(8).split(“,”)

ids.foreach(

id => {

acc.add((id,“order”))

}

)

} else if (datas(10) != “null”) {

//支付的场合

val ids = datas(10).split(“,”)

ids.foreach(

id => {

acc.add((id,“order”))

}

)

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

小编精心为大家准备了一手资料

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

BATJ面试要点及Java架构师进阶资料

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

r、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

[外链图片转存中…(img-0p2qJMpE-1712555323401)]

BATJ面试要点及Java架构师进阶资料

[外链图片转存中…(img-s0zxxz2Z-1712555323401)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值