大数据经典面试题

大数据经典面试题

var、val和def之间有什么区别?

var是定义变量的,类似于Java中的变量,变量的值可以更改,但是变量的类型不能更改 val是定义值的,一旦赋值了,则这个值是不能变的,就和Java中的常量关键字final的功能类似 def是定义方法的关键词,只有调用了才执行的

trait和abstract class之间有什么区别

第一个区别就是一个类只能继承一个abstract class,但是可以通过with混入多个trait 第二个区别就是abstract class可以有构造器,而trait不能有 第三个区别就是abstract class可以和Java无缝的交互,但是包含了实现的trait的不能和Java无缝的交互

object和class之间的区别是?什么是伴生对象?

一个object是一个已经实例化好的单例对象,不需要开发人员使用关键字new来实例化 如果一个object的名字和一个class的名字相同的话,那么这个object就是这个class的伴生对象。伴生对象和伴生类之间可以相互访问私有方法。伴生对象中的方法和Java中的static修饰的方法一样。

什么是case class?

样本类是一种不可变且可分解类的语法糖,这个语法糖的意思大概是在构建时,自动实现一些功能。样本类具有以下特性: (1)自动添加与类名一致的构造函数(这个就是前面提到的伴生对象,通过apply方法实现),即构造对象时,不需要new; (2)样本类中的参数默认添加val关键字,即参数不能修改; (3)默认实现了toString,equals,hashcode,copy等方法; (4)样本类可以通过==比较两个对象,并且不在构造方法中定义的属性不会用在比较上

call by value 和 call by name的求值策略的区别?

call-by-value是在调用函数之前计算;call-by-name是在需要时计算

Option类型的定义和使用场景

Scala的Option是为了解决Java中null的问题而产生的,在Java中过多的使用null的时候很容易得到NullPointerException(即空指针异常)。Scala中不推崇使用null,而是使用Option代替,Option包含None和Some.

yield如何工作?Comprehension(推导式)的语法糖是什么操作?

yield用于循环迭代中生成新值,yield是comprehensions的一部分,是多个操作(foreach, map, flatMap, filter or withFilter)的composition语法糖。 comprehension(推导式)是若干个操作组成的替代语法。如果不用yield关键字,comprehension(推导式)可以被forech操作替代,或者被map/flatMap,filter代替。

什么是函数的科里化(currying)

函数的科里化技术使得接收多个参数的函数变成一系列的只接收一部分参数的函数

什么是尾递归?

正常递归就是在方法内部的一个地方调用本方法,每一次递归步骤,需要保存信息到堆栈里面,当递归步骤很多时,导致堆栈溢出。尾递归就是为了解决上述问题,在尾递归中所有的计算都是在递归之前调用,

什么是高阶函数(High Order Function)?

答M高阶函数就是返回是函数或者参数是函数的函数,比如scala集合中的map、flatMap以及filter等都是函数作为参数的函数,所以都是高阶函数

Scala集合中高阶函数map和flatMap的区别是什么?

map方法接收的参数是函数: A => B flatMap方法接收的参数是函数: A => GenTraversableOnce[B] 那么map是返回的结果是一对一的,比如List(1, 2).map(.to(3)) = List(Rang(1, 2,3), Rang(2,3)) 而flatMap返回的是一对多的并且展平,比如List(1, 2).map(.to(3)) = List(1,2,3,2,3)

Seq有哪两种子类,各自的优缺点是?默认使用的是哪种子类呢?

Seq有LinearSeq和IndexedSeq两种子类 LinearSeq用于递归比较好,而IndexedSeq用于随机访问的效率很高 默认使用的是List