Scala 更适合用于大数据处理和机器学习

阅读数:59 2014 年 10 月 20 日

话题:Scala语言 & 开发文化 & 方法

Scala 是一门现代的多范式编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala 允许用户使用命令和函数范式编写代码。Scala 运行在 Java 虚拟机之上,可以直接调用 Java 类库。对于新手来说,Scala 相对比较复杂,其看起来灵活的语法并不容易掌握,但是对于熟悉 Scala 的用户来说,Scala 是一把利器,它提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构。近日,Spotify 的软件工程师 Neville Li 发表了一篇题为《数据工程师应该学习 Scala 的三个理由》的文章,他认为现在的编程语言种类非常多,每种语言都各有优缺点,并且它们的适用的场景也不同,比如 Scala 就非常适合用于数据处理和机器学习。

在大数据和机器学习领域,很多开发者都有 Python/R/Matlab 语言的背景,相比与 Java 或者 C++,Scala 的语法更容易掌握。从以往的经验来看,只要掌握基本的集合 API 以及 lambda,一个没有经验的新员工就可以快速上手处理数据。像BreezeScalaLabBIDMach这样的类库都通过操作符重写模仿了一些流行工具的语法以及其它的一些语法糖,简单并且容易使用。另外,Scala 的性能比传统的 Python 或者 R 语言更好。

由于 Scala 运行于 Java 平台(Java 虚拟机),并兼容现有的 Java 程序,所以 Scala 可以和大数据相关的基于 JVM 的系统很好的集成,比如基于 JVM 类库的框架 Scalding(Cascading)、Summingbird(Scalding 和 Storm)、Scrunch(Crunch)、Flink(Java 编写并有 Scala 的 API),本身使用 Scale 开发的系统 Spark、Kafka。另外,很多数据存储解决方案都支持 JVM 语言,比如CassandraHBaseVoldemortDatomic

函数编程范式更适合用于 Map/Reduce 和大数据模型,它摒弃了数据与状态的计算模型,着眼于函数本身,而非执行的过程的数据和状态的处理。函数范式逻辑清晰、简单,非常适合用于处理基于不变数据的批量处理工作,这些工作基本都是通过 map 和 reduce 操作转换数据后,生成新的数据副本,然后再进行处理。而大多数的 Scala 数据框架都能够把 Scala 数据集合 API 和抽象数据类型相统一,比如 Scalding 中的TypedPipe与 Spark 中的RDD都有相同的方法,包括 map、flatMap、filter、reduce、fold 和 groupBy,这样使用 Scala 来处理就更为方便。开发者只需要学习标准集合就可以迅速上手其它工具包。另外,很多的类库都参考了范畴论中的一些设计,它们通过使用 semigroup、monoid、group 标识来保证分布式操作的正确性。