Hadoop面试总结(一)Linux命令、Scala

linux命令

1:ls命令

这是一个非常有用的查看文件与目录的命令,list之意,它的参数非常多,下面就列出一些我常用的参数吧,如下:
-l :列出长数据串,包含文件的属性与权限数据等
-a :列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用)
-d :仅列出目录本身,而不是列出目录的文件数据
-h :将文件容量以较易读的方式(GB,kB等)列出来
-R :连同子目录的内容一起列出(递归列出),等于该目录下的所有文件都会显示出来

2:awk

删除重复行

$ awk '!($0 in array) { array[$0]; print}' temp

打印/etc/passwd中所有包含同样的uid和gid的行

$ awk -F ':' '$3=$4' /etc/passwd

打印文件中的指定部分的字段

$ awk '{print $2,$5;}' employee.txt

whatis — What is this command

whatis 会用单行来描述给定的命令,就是解释当前命令。

uname

uname会显示出关于系统的重要信息,如内核名称、主机名、内核版本、处理机类型等等,使用uname -a可以查看所有信息。

df — Disk space Free

df查看文件系统中磁盘的使用情况–硬盘已用和可用的存储空间以及其它存储设备。你可以使用df -h将结果以人类可读的方式显示。

ps — ProcesseS

ps显示系统的运行进程。

top — Top processes

top命令会默认按照CPU的占用情况,显示占用量较大的进程,可以使用top -u 查看某个用户的CPU使用排名情况。


Scala

Q1 var,val和def三个关键字之间的区别?

  • 答:var是变量声明关键字,类似于Java中的变量,变量值可以更改,但是变量类型不能更改。
    val常量声明关键字。
    def 关键字用于创建方法(注意方法和函数的区别
    还有一个lazy val(惰性val)声明,意思是当需要计算时才使用,避免重复计算

Q2 trait(特质)和abstract class(抽象类)的区别?

  • 答:(1)一个类只能集成一个抽象类,但是可以通过with关键字继承多个特质;
    (2)抽象类有带参数的构造函数,特质不行(如 trait t(i:Int){} ,这种声明是错误的)

Q3 object和class的区别?

  • 答:object是类的单例对象,开发人员无需用new关键字实例化。如果对象的名称和类名相同,这个对象就是伴生对象

Q4 case class (样例类)是什么?

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

Q5 Java和Scala 异步计算的区别?

  • 答:

    Java Future:两者都代表异步计算的结果,但Java的Future要求您通过阻塞get方法访问结果。虽然您可以调用isDone来查看Java Future是否在调用get之前完成,从而避免任何阻塞,必须等到Java Future完成后才能继续进行任何使用结果的计算。

    Scala Future:您可以在Scala Future上指定转换,无论它是否已完成。每次转换都会产生一个新的Future,表示由函数转换的原始Future的异步结果这允许您将异步计算描述为一系列转换。

    Scala的Future经常消除,需要推理共享数据和锁定。当您调用Scala方法时,它会在“等待”时执行计算并返回结果。如果该结果是Future,则Future表示另一个通常由完全不同的线程异步执行的计算。

    示例:您可以将下一个计算映射到未来,而不是阻塞然后继续另一个计算。

    以后将在十秒后完成:

    val fut = Future { Thread.sleep(10000);21+21}

    使用递增1的函数映射此未来将产生另一个未来。

     val result = fut.map(x=>x+1)
  • 请阅读这个 really clean and simple answer on StackOverflow

Q6 unapply 和apply方法的区别, 以及各自使用场景?

  • 答:先讲一个概念——提取器,它实现了构造器相反的效果,构造器从给定的参数创建一个对象,然而提取器却从对象中提取出构造该对象的参数,scala标准库预定义了一些提取器,如上面提到的样本类中,会自动创建一个伴生对象(包含apply和unapply方法)。
    为了成为一个提取器,unapply方法需要被伴生对象。
    apply方法是为了自动实现样本类的对象,无需new关键字。

Q7 伴生对象是什么?

  • 答:前面已经提到过,伴生对象就是与类名相同的对象,伴生对象可以访问类中的私有量,类也可以访问伴生对象中的私有方法,类似于Java类中的静态方法。伴生对象必须和其对应的类定义在相同的源文件。

Q6 unapply 和apply方法的区别, 以及各自使用场景?

  • 答:先讲一个概念——提取器,它实现了构造器相反的效果,构造器从给定的参数创建一个对象,然而提取器却从对象中提取出构造该对象的参数,scala标准库预定义了一些提取器,如上面提到的样本类中,会自动创建一个伴生对象(包含apply和unapply方法)。
    为了成为一个提取器,unapply方法需要被伴生对象。
    apply方法是为了自动实现样本类的对象,无需new关键字。

Q7 伴生对象是什么?

  • 答:前面已经提到过,伴生对象就是与类名相同的对象,伴生对象可以访问类中的私有量,类也可以访问伴生对象中的私有方法,类似于Java类中的静态方法。伴生对象必须和其对应的类定义在相同的源文件。

Q8 Scala类型系统中Nil, Null, None, Nothing四个类型的区别?

  • 答:先看一幅Scala类型图

    scala类型图.png

    Null是一个trait(特质),是所以引用类型AnyRef的一个子类型,null是Null唯一的实例。
    Nothing也是一个trait(特质),是所有类型Any(包括值类型和引用类型)的子类型,它不在有子类型,它也没有实例,实际上为了一个方法抛出异常,通常会设置一个默认返回类型。
    Nil代表一个List空类型,等同List[Nothing]
    None是Option monad的空标识(深入了解请参考问题Q11)

Q9 Unit类型是什么?

  • 答:Unit代表没有任何意义的值类型,类似于java中的void类型,他是anyval的子类型,仅有一个实例对象"( )"

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

  答:(1)call-by-value是在调用函数之前计算;
    (2) call-by-name是在需要时计算

Q11 Option类型的定义和使用场景?

  • 答:在Java中,null是一个关键字,不是一个对象,当开发者希望返回一个空对象时,却返回了一个关键字,为了解决这个问题,Scala建议开发者返回值是空值时,使用Option类型,在Scala中null是Null的唯一对象,会引起异常,Option则可以避免。Option有两个子类型,Some和None(空值)

Q12 yield如何工作?

  • 答:yield用于循环迭代中生成新值,yield是comprehensions的一部分,是多个操作(foreach, map, flatMap, filter or withFilter)的composition语法糖。

Q13 解释隐示参数的优先权

  • 答:在Scala中implicit的功能很强大。当编译器寻找implicits时,如果不注意隐式参数的优先权,可能会引起意外的错误。因此编译器会按顺序查找隐式关键字。顺序如下:
    (1)当前类声明的implicits ;
    (2)导入包中的 implicits;
    (3)外部域(声明在外部域的implicts);
    (4)inheritance
    (5)package object
    (6)implicit scope like companion objects
    一个参考文章:set of examples can be found here.

Q14 comprehension(推导式)的语法糖是什么操作?

  • 答:comprehension(推导式)是若干个操作组成的替代语法。如果不用yield关键字,comprehension(推导式)可以被forech操作替代,或者被map/flatMap,filter代替。

Q17 Option ,Try 和 Either 三者的区别?

  • 答:这三种monads允许我们显示函数没有按预期执行的计算结果。
    Option表示可选值,它的返回类型是Some(代表返回有效数据)或None(代表返回空值)。
    Try类似于Java中的try/catch,如果计算成功,返回Success的实例,如果抛出异常,返回Failure。
    Either可以提供一些计算失败的信息,Either有两种可能返回类型:一个是 Right ,一个是 Left,习惯性地将Left 值代表不好的结果(失败的结果),Right 代表好的结果(成功的结果)

Q18 什么是函数柯里化?

  • 答:柯里化技术是一个接受多个参数的函数转化为接受其中几个参数的函数。经常被用来处理高阶函数。
  • 例如:

          def mul(x:Int,y:Int) = x * y  //该函数接受两个参数

          def mulOneAtTime(x:Int) = (y:Int) => x * y  //该函数接受一个参数生成另外一个接受单个参数的函数

          这样的话,如果需要计算两个数的乘积的话只需要调用:

          mulOneAtTime(5)(4)

        这就是函数的柯里化

 Q19 什么是尾递归?

正常递归,每一次递归步骤,需要保存信息到堆栈里面,当递归步骤很多时,导致堆栈溢出。
尾递归就是为了解决上述问题,在尾递归中所有的计算都是在递归之前调用,
编译器可以利用这个属性避免堆栈错误,尾递归的调用可以使信息不插入堆栈,从而优化尾递归。
使用 @tailrec 标签可使编译器强制使用尾递归。

Q20 什么是高阶函数?

  • 答:高阶函数指能接受或者返回其他函数的函数,scala中的filter map flatMap函数都能接受其他函数作为参数。
 


























Null是一个trait(特质),是所以引用类型AnyRef的一个子类型,null是Null唯一的实例。
Nothing也是一个trait(特质),是所有类型Any(包括值类型和引用类型)的子类型,它不在有子类型,它也没有实例,实际上为了一个方法抛出异常,通常会设置一个默认返回类型。
Nil代表一个List空类型,等同List[Nothing]
None是Option monad的空标识(深入了解请参考问题Q11)


作者:IIGEOywq
链接:https://www.jianshu.com/p/ace2bb24dc11
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
原文地址:https://www.cnblogs.com/Vowzhou/p/11242446.html