spark-面试题(含答案)

1 var, val和def三个关键字之间的区别?
var immutable val
val mutable variable
def function defined keyword

2.object 和 class 的区别?

object 单例 无构造器 成员变量和method都是static 可以直接访问main方法 可以与class同名 构成伴生对象

class 有构造器 需要创建对象 才能在main方法中执行

3.case class (样本类)是什么?
经过scala编译器优化 适合于对不可变数据建模 可用于模式匹配
Case class的每个参数默认以val(不变形式)存在,除非显式的声明为var
自动产生伴生对象,、且半生对象中自动产生appay方法来构建对象
半生对象自动产生unapply方法,提取主构造器的参数进行模式匹配
产生copy方法,来构建一个与现有值相同的新对象
自动产生hashcode,toString,equals方法
默认是可以序列化的,也就是实现了Serializable ;

4 Option , Try和Either三者的区別?

三者内部都包含两个case class

区别是:

Option 代表可选值,一个是 Some(代表有值),一个是 None (值为空);常用于结果可能为 null 的情况;

Try
运算的结果有两种情况,一个是运行正常,即 Success ,一个是运行出错,抛出异常 ,即 Failure ,其中 Failure 里面包含的是异常的信息;

Either 代表结果有两种可能 Right 或者 left

5.什么是函数柯里化

函数可以定义多个参数列表。当使用较少的参数列表调用方法时,这将生成一个将缺少的参数列表作为参数的函数。如果固定某些参数,将得到接受余下参数的一个函数

作用:
1.提高适用性,参数复用

2.延迟计算

  1. trait (特质)和abstract class (抽象类)的区別?

一个class可以实现多个trait 只能继承一个abstract class
trait
用于在类之间共享接口和字段。它们类似于Java 8的接口。不能实例化,因此没有参数。

abstract class 可以定义有参数构造器

二、编程题(每题10分,共30分}

  1. 99乘法表。
 def main(args: Array[String]): Unit = {
    for (
      i <- 1 to 9;
      j <- 1 to i;
      res = s"$j*$i=${i * j}\t"
    ) yield {
      if (j == i) s"$res\n" else res
    }.foreach(print)

  }

2.编写一个BankAccount类,加入deposit和withdraw方法,和一个只读的
balance属性。

class BankAcount(val balance : Int = 0) {
  def deposit() {}
  def withdraw() {}
}

  1. Spark wordcount 计算。
object WordCount {
  def main(args: Array[String]) {
    if (args.length < 1) {
      System.err.println("Usage: WordCount <directory>")
      System.exit(1)
    }
    val sparkConf = new SparkConf().setAppName("WordCount" 
    val ssc = new StreamingContext(sparkConf, Seconds(2))
    val lines = ssc.textFileStream(args(0))
    val words = lines.flatMap(_.split(" "))
    val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)
    wordCounts.print()
    ssc.start()
    ssc.awaitTermination()
  }
}

三、简答题(每题8分 共40分)

1、driver的功能是什么?
一个程序,它声明数据的RDD上的转换和操作,并将这些请求提交给master
功能
1)、创建SparkContext的程序,连接到给定的SparkMaster

2)、划分rdd stage 并生成 DAGScheduler

3)、通过taskScheduler生成并发送task到executor

它的位置独立于master、slave。您在master节点,也可以从另一个节点运行它。唯一的要求是它必须在一个可以从Spark Workers访问的网络中

2、RDD宽依赖和窄依赖?

wide dependency or shuffle dependency
多个子RDD的Partition会依赖同一个父RDD的Partition

narrow dependency
每一个父RDD的Partition最多被子RDD的一个Partition使用

3、map 和 flatMap、mapPartition 的区别?
map
通过向这个RDD的所有元素应用一个函数来返回一个新的RDD。

flatMap
返回一个新的RDD 首将一个函数应用于该RDD的所有元素,然后将结果展平。

mapPartitions
通过向这个RDD的每个分区应用一个函数来返回一个新的RDD
preservespartitioning 指示输入函数是否保留分区器,
默认为false,除非这是pairRDD,并且输入函数不修改keys

4、spark中的RDD是什么?有哪些特性?

RDD是弹性分布式数据集 不可变的可并行操作的元素的分区集合
每个RDD具有五个主要特性:

1)、有分区列表

2)、可用于计算每个分区的函数

3)、依赖于其他RDD的列表

4)、可选pairRDD的分区器(例如说RDD是哈希分区的)

5)、优先选择本地最优的位置去计算每个分片(例如,HDFS文件块位置)即数据的本地性

5、spark中如何划分 stage
stage是一组并行任务,作为job的部分 计算相同的函数
stage通过是否存在Shuffle或者宽依赖为边界来划分的 如遇到reduceByKey,groupByKey的算子等算子
从当前job的最后一个算子往前推,遇到宽依赖,那么当前在这个批次中的所有算子操作都划分成一个stage,然后继续按照这种方式在继续往前推,如在遇到宽依赖,又划分成一个stage,一直到最前面的一个算子。最后整个job会被划分成多个stage,而stage之间又存在依赖关系,后面的stage依赖于前面的stage

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿与禅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值