Spark编程题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark编程题相关的知识,希望对你有一定的参考价值。

参考技术A 现有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 & Scala scala编程案例:统计学生成绩

Scala 统计学生成绩

题干

学生的成绩清单格式如下所示,第一行为表头,各字段意思分别为学号、性别、课程名 1、课程名 2 等,后面每一行代表一个学生的信息,各字段之间用空白符隔开

Id gender Math English Physics

301610 male 80 64 78

301611 female 65 87 58

给定任何一个如上格式的清单(不同清单里课程数量可能不一样),要求尽可能采用函 数式编程,统计出各门课程的平均成绩,最低成绩,和最高成绩;另外还需按男女同学分开, 分别统计各门课程的平均成绩,最低成绩,和最高成绩。

源代码(命令台交互式)

import scala.io.Source
val inputfile=Source.fromFile("/home/beyond-dhl/Desktop/dhl/grade1.txt")
val lines = inputfile.getLines
val Data = lines.map_.split(" ")
val header = originalData.head
val courseNames = header.drop(2)
val allStudents = originalData.tail
val stuNum = allStudents.length
val (maleLines,femaleLines) = allStudents partition _(1)=="male"
val courseNum = courseNames.length
for(i <- 2 to courseNum+1)
     | val temp = allStudents map elem => elem(i).toDouble;
     | println("for xun huan jie guo:temp,avg,max,min");
     | println(temp.sum/stuNum,temp.min,temp.max)
val result =
     | (for (i <-2 to courseNum+1) yield 
     | val temp1 = allStudents map  elem => elem(i).toDouble;(temp1.sum/stuNum, temp1.min, temp1.max) 
     | )

for(i <- 0 to courseNum-1)
     | println(courseNames(i));println("avg,min,max:");println(result(i))

相应结果






以上是关于Spark编程题的主要内容,如果未能解决你的问题,请参考以下文章

高频面试题[Scala/Spark]

大数据计算 Spark的安装和基础编程

最近经历的一些大数据(Spark/Hadoop)面试题

Python编程题汇总(持续更新中……)

Spark & Scala scala编程案例:统计学生成绩

java编程题