spark-面試題(含答案)

1 var, val和def三個關鍵字之間的區別?
var immutable variable
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章