Spark采用Scala,是因为Scala支持函数式编程吗?

Posted 艾叔编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark采用Scala,是因为Scala支持函数式编程吗?相关的知识,希望对你有一定的参考价值。

Spark框架采用Scala开发,Scala是一种小众语言,个性十分鲜明,有的人使用了它之后,非常喜欢,觉得世间再无其他语言。

而有的人用过之后,又会觉得非常痛苦。

那么,Scala有什么特点?

为什么要选择Scala来开发Spark框架呢?

对于我们而言,是选择Scala来开发Spark应用程序,还是采用Java、Python?

本节将回答这些问题。

1. 为什么用Scala开发Spark框架

Spark作者的论文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》中解释了原因。

We chose to use Scala due to its combination of conciseness (which is especially useful for interactive use) and efficiency (due to static typing). However, nothing about the RDD abstraction requires a functional language; it would also be possible to provide RDDs in other languages by using classes to represent the user’s functions,as is done in Hadoop

翻译成中文,选择Scala开发Spark是因为它同时具备:简洁高效这两个特点。

简洁:对于交互式应用非常有用。这里的conciseness,翻译成简洁,应当是方便的意思,Scala可以直接通过Shell执行,在大数据处理的场景中,可以快速看到处理后的结果,很多功能往往就是一行代码就可以搞定,不需要像Java那样很多行,要编写一个完整的程序,编译后再运行,因此,Scala的开发效率会比较高(语言上的简洁+直接运行);

高效:Scala本质上是静态类型语言,它被编译成Java的字节码,在JVM上运行,效率和Java是差不多的,因此是高效的。

因此,使用Scala作为Spark开发语言,是因为Scala的简洁和高效,并不是因为它支持函数式编程。

2. 为什么用Scala开发Spark程序

使用Scala开发Spark程序有很多优点:

  • Scala支持函数式编程();

  • Scala的REPL(Read-Eval-Print-Loop,读取-计算-打印-循环,又称交互式解释器)可以即时验证程序;

  • Scala支持隐式转换(是函数调用的隐式转换,不是变量类型的隐式转换),这样,可以在没有第三方库源码的基础上(第三方库可以不动),扩展库接口;

  • Scala支持类型推断,代码更简洁;

  • Scala程序在JVM上运行,可以兼容所有的Java库;

  • Spark框架本身采用Scala开发,Scala属于Spark的原生语言,Spark对Scala API的支持度最好;

  • 掌握Scala,是阅读Spark源码,深入Spark内部机制的必要条件。

使用Scala开发Spark程序也有缺点:

  • Scala学习门槛高、内容庞杂,学习曲线陡峭,学习人群相对少;

  • Scala编译速度慢;

  • Scala功能强大,同样的功能,通常会有很多种实现方法,每种方法的效率差距可能会很大(Python同样的功能,可能只有1种实现),因此,有种说法,说Scala是为聪明人准备的,这个和C语言“相信程序员”的说法类似;

  • Scala代码简洁,表达力强,但有时为了简洁,会过分抽象或者引入生僻的操作符或函数式语法,这样就增加了协作开发和后期维护的困难;

  • · 支持Scala的集成开发工具少且功能不全,要弱于Python和Java;

  • · Scala的社区规模、成熟度都要弱于Java和Python。


艾叔大数据快速入门系列

【2】推荐:










以上是关于Spark采用Scala,是因为Scala支持函数式编程吗?的主要内容,如果未能解决你的问题,请参考以下文章

Scala语言入门

Scala语言学习笔记一

2016.3.3(Spark框架预览,Scala部分应用函数闭包高阶函数,关于语义分析的一些心得)

IntelliJ IDEA开发Spark的Maven项目Scala语言

如何使用scala将特定函数转换为apache spark中的udf函数? [复制]

Spark记录-Scala模式匹配