Spark编程题

Spark编程题,第1张

现有100W+条数据存储在hdfs中的userinfo文件夹中的多个文件中,数据格式如下:

张碰宏空三|男|23|未婚|北京|海淀

李四|女|25|已婚|河北|石家庄

求:

1.数据中所有人的平均年龄

2.数据中所有男性未婚的人数和女性未婚人数

3.数据中20-30已婚数量前3的省份

答案:

package spark08

import org.apache.spark.rdd.RDD

import org.apache.spark.util.LongAccumulator

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

/**

*张三|男|23|未婚|北京|海淀

*李四|女|25|已婚|河北|石家庄

  *

*统计:

* 1.数据中所有人的平均年龄

* 2.数据中所有男性未婚的人数和女性未婚人数

* 3.数据中20-30已婚数量前3的省份

* 4.未婚比例(未婚人数/该城市总人数)最高的前3个城市

  */

object UserInfo {

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

    val conf: SparkConf = new SparkConf()

      .setAppName(this.getClass.getSimpleName)

      .setMaster("local[*]")

    val sc = new SparkContext(conf)

//读取原始文件

    val strFile: RDD[String] = sc.textFile("D:\\data\\data\\userinfo")

    val srcRdd: RDD[(String, String, Int, String, String, String)] = strFile.map(t =>{

    绝隐  val strings: Array[String] = t.split("\\|")

      val name: String = strings(0)

      val gender = strings(1)

      val age = strings(2).toInt

      val isMarry: String = strings(3)

      val province = strings(4)

      val city = strings(5)

      (name, gender, age, isMarry, province, city)

    })

    srcRdd.cache()

//1.数据中所有人的平均年龄 李四|女|25|已婚|河笑瞎北|石家庄

val ageAccumulator: LongAccumulator = sc.longAccumulator //使用累加器统计总人数

    val ageCount: Int = srcRdd.map(t =>{

      ageAccumulator.add(1)

      t._3

    }).reduce(_ + _)

    val ageNumber = ageAccumulator.value

    val avgAge = ageCount.toLong/(ageNumber*1.0)

println(s"所有人的平均年龄为${avgAge}")

//2.数据中所有男性未婚的人数和女性未婚人数

    val genderAndMarryRDD: RDD[(String, Iterable[(String, String)])] = srcRdd.map(t =>{

(t._1, t._3) //性别,婚否

}).filter(_._2.equals("未婚")).groupBy(_._1) //按性别分组

    val res2RDD: RDD[(String, Int)] = genderAndMarryRDD.mapValues(t=>t.size)

    res2RDD.collect().foreach(println)

//数据中20-30已婚数量前3的省份 李四|女|25|已婚|河北|石家庄

    val res3: Array[(Int, String)] = srcRdd.filter(t =>{

t._3 >= 20 &&t._3 <= 30 &&t._4.equals("已婚")

})//删选出满足20-30已婚的数据,按省份分组,求v的size即是20-30已婚数量

      .groupBy(_._5).mapValues(_.size)

//k,v互换取前3

      .map(t =>(t._2, t._1)).top(3)

    res3.foreach(println)

//(城市,(未婚人数,已婚人数))

//未婚比例(未婚人数/该城市总人数)最高的前3个城市 李四|女|25|已婚|河北|石家庄

Spark是一种通用的大数据计算框架,和传统的大数据技术MapReduce有本质区别。前者是基于内存并行计算的框架,而mapreduce侧重磁租猛隐盘计算。Spark是加州知巧大学伯克利分校AMP实验室开发的通用内存并行计算框架,用于构建大型的、低延迟的数据分析应用程序。

Spark同样支持离线计算和实时计算两种模式。Spark离线计算速度要比Mapreduce快10-100倍。而实时计算方面,则依赖于弊厅SparkStreaming的批处理能力,吞吐量大。不过相比Storm,SparkStreaming并不能做到真正的实时。

Spark使用强大的函数式语言Scala开发,方便简单。同时,它还提供了对Python、Java和R语言的支持。

作为大数据计算框架MapReduce的继任者,Spark具备以下优势特性。

1,高效性

不同于MapReduce将中间计算结果放入磁盘中,Spark采用内存存储中间计算结果,减少了迭代运算的磁盘IO,并通过并行计算DAG图的优化,减少了不同任务之间的依赖,降低了延迟等待时间。内存计算下,Spark 比 MapReduce 快100倍。

2,易用性

不同于MapReduce仅支持Map和Reduce两种编程算子,Spark提供了超过80种不同的Transformation和Action算子,如map,reduce,filter,groupByKey,sortByKey,foreach等,并且采用函数式编程风格,实现相同的功能需要的代码量极大缩小。

3,通用性

Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。

4,兼容性

Spark能够跟很多开源工程兼容使用。如Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器,并且Spark可以读取多种数据源,如HDFS、HBase、MySQL等。

第一阶段:熟练的掌握Scala语言

1,Spark框架是采用Scala语言编写的,精致而优雅。要想成为Spark高手,你就必须阅读Spark的源代码,就必须掌握Scala,

2, 虽然说现在的Spark可以采用多语言Java、Python等进行应用程序开发,但是最快速的和支持最好的开发API依然并将永远是Scala方式的API,所以你必须掌握Scala来编写复杂的和高性能的Spark分布式程序

3, 尤其要熟练掌握Scala的trait、apply、函数式编程、泛型、逆变与协变等

第二阶段:精通Spark平台本身提供给开发者API

1, 掌握Spark中面向RDD的开发模式,掌握各种transformation和action函数的使用

2, 掌握Spark中的宽依赖和窄依赖以及lineage机制

3, 掌握RDD的计算流程乎让,例如Stage的划分、Spark应用程序提交给集群的基本过程和Worker节点基础的工作原理等

第三阶段:深入Spark内核

此阶段主要是通过Spark框架的源码研读来李顷游深入Spark内核部分:

1, 通过源码掌握Spark的任务提交过程

2, 通过源码掌握Spark集群的任务调度

3, 尤其要精通DAGScheduler、TaskScheduler和Worker节点内部的工作的每一步的细节

第四阶级:掌握基于Spark上的核心框架的使用

Spark作为云计算大数据时代的集大成者,在实时流处理、图技术、机器学习、NoSQL查询等方面具有显著的优势,我们使用Spark的时候大部分时间都是在使用其上的框架例如Shark、Spark Streaming等:

1, Spark Streaming是非常出色的实时流处理框架,要掌握其DStream、transformation和checkpoint等

2, Spark的离线统计分析功能,Spark 1.0.0版本在Shark的基础上推出了Spark SQL,离线统计分析的功能的效率有显著的提升,需要重点掌握

3, 对于Spark的机器学习和GraphX等要掌握其原理和用法

第五阶级:做商业级别的Spark项目

通过一个完整的具有代表性的Spark项目来贯穿Spark的方方面面,包括项目的架构设计、用到的技术的剖析、开发实现、运维等,完整掌握其中的每一个阶段和细节,这样就可以让您以后可以从容面对绝大多数Spark项目。

第六阶级:提供Spark解决哪销方案

1, 彻底掌握Spark框架源码的每一个细节

2, 根据不同的业务场景的需要提供Spark在不同场景的下的解决方案

3, 根据实际需要,在Spark框架基础上进行二次开发,打造自己的Spark框架


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12306824.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存