R、Python、Scala和Java,到底该使⽤哪⼀种⼤数据编程语
⾔?
有⼀个⼤数据项⽬,你知道问题领域(problem domain),也知道使⽤什么基础设施,甚⾄可能已决定使⽤哪种框架来处理所有这些数据,但是有⼀个决定迟迟未能做出:我该选择哪种语⾔?(或者可能更有针对性的问题是,我该迫使我的所有开发⼈员和数据科学家⾮要⽤哪种语⾔?)这个问题不会推迟太久,迟早要定夺。
当然,没有什么阻⽌得了你使⽤其他机制(⽐如XSLT转换)来处理⼤数据⼯作。但通常来说,如今⼤数据⽅⾯有三种语⾔可以选择:R、Python和Scala,外加⼀直以来屹⽴于企业界的Java。那么,你该选择哪种语⾔?为何要选择它,或者说何时选择它?
下⾯简要介绍了每种语⾔,帮助你做出合理的决定。
R
R经常被称为是“统计⼈员为统计⼈员开发的⼀种语⾔”。如果你需要深奥的统计模型⽤于计算,可能会在CRAN上到它――你知
道,CRAN叫综合R档案⽹络(Comprehensive R Archive Network)并⾮⽆缘⽆故。说到⽤于分析和标绘,没有什么⽐得过ggplot2。⽽如果你想利⽤⽐你机器提供的功能还强⼤的功能,那可以使⽤SparkR绑定,在R上运⾏Spark。
然⽽,如果你不是数据科学家,之前也没有⽤过Matlab、SAS或OCTAVE,可能需要⼀番调整,才能使⽤R来⾼效地处理。虽然R很适合分析数据,但是就⼀般⽤途⽽⾔不太擅长。你可以⽤R构建模型,但是你需要考虑将模型转换成Scala或Python,才能⽤于⽣产环境,你不太可能使⽤这种语⾔编写⼀种集控制系统(运⽓好的话,你可以对它进⾏调试)。
Python
如果你的数据科学家不使⽤R,他们可能就会彻底了解Python。⼗多年来,Python在学术界当中⼀直很流⾏,尤其是在⾃然语⾔处理(NLP)等领域。因⽽,如果你有⼀个需要NLP处理的项⽬,就会⾯临数量多得让⼈眼花缭乱的选择,包括经典的NTLK、使⽤GenSim的主题建模,或者超快、准确的spaCy。同样,说到神经⽹络,Python同样游刃有余,有Theano和Tensorflow;随后还有⾯向机器学习的scikit-learn,以及⾯向数据分析的NumPy和Pandas。
还有Juypter/iPython――这种基于Web的笔记本服务器框架让你可以使⽤⼀种可共享的⽇志格式,将代码、图形以及⼏乎任何对象混合起来。这⼀直是Python的杀⼿级功能之⼀,不过这年头,这个概念
证明⼤有⽤途,以⾄于出现在了奉⾏读取-读取-输出-循环(REPL)概念的⼏乎所有语⾔上,包括Scala和R。
Python往往在⼤数据处理框架中得到⽀持,但与此同时,它往往⼜不是“⼀等公民”。⽐如说,Spark中的新功能⼏乎总是出现在
python转java代码Scala/Java绑定的⾸位,可能需要⽤PySpark编写⾯向那些更新版的⼏个次要版本(对Spark Streaming/MLLib⽅⾯的开发⼯具⽽⾔尤为如此)。
与R相反,Python是⼀种传统的⾯向对象语⾔,所以⼤多数开发⼈员⽤起来会相当得⼼应⼿,⽽初次接触R或Scala会让⼈⼼⽣畏惧。⼀个⼩问题就是你的代码中需要留出正确的空⽩处。这将⼈员分成两⼤阵营,⼀派觉得“这⾮常有助于确保可读性”,另⼀派则认为,2016年,我们应该不需要就因为⼀⾏代码有个字符不在适当的位置,就要迫使解释器让程序运⾏起来。
Scala
现在说说Scala:在本⽂介绍的四种语⾔中,Scala是最轻松的语⾔,因为⼤家都欣赏其类型系统。Scala在JVM上运⾏,基本上成功地结合了函数范式和⾯向对象范式,⽬前它在⾦融界和需要处理海量数据的公司企业中取得了巨⼤进展,常常采⽤⼀种⼤规模分布式⽅式来处理(⽐如Twitter和LinkedIn)。它还是驱动Spark和Kafka的⼀种语⾔。
由于Scala在JVM⾥⾯运⾏,它可以⽴即随意访问Java⽣态系统,不过它也有⼀系列⼴泛的“原⽣”库,⽤于处理⼤规模数据(尤其是Twitter的Algebird和Summingbird)。它还包括⼀个使⽤⾮常⽅便的REPL,⽤于交互式开发和分析,就像使⽤Python和R那样。
我个⼈⾮常喜欢Scala,因为它包括许多实⽤的编程功能,⽐如模式匹配,⽽且被认为⽐标准的Java简洁得多。然⽽,⽤Scala来开发不⽌⼀种⽅法,这种语⾔将此作为⼀项特⾊来宣传。这是好事!不过考虑到它拥有图灵完备(Turing-complete)的类型系统和各种弯弯曲曲的运算符(“/:”代表foldLeft,“:\”代表foldRight),很容易打开Scala⽂件,以为你看到的是某段讨厌的Perl代码。这就需要在编写Scala时遵循⼀套好的实践和准则(Databricks的就很合理)。
另⼀个缺点是,Scala编译器运⾏起来有点慢,以⾄于让⼈想起以前“编译!”的⽇⼦。不过,它有REPL、⽀持⼤数据,还有采⽤Jupyter 和Zeppelin这⼀形式的基于Web的笔记本框架,所以我觉得它的许多⼩问题还是情有可原。
Java
最终,总是少不了Java――这种语⾔没⼈爱,被遗弃,归⼀家只有通过起诉⾕歌才有钱可赚时才似乎关⼼它的公司(注:Oracle)所有,完全不时髦。只有企业界的⽆⼈机才使⽤Java!不过,Java可能很适合你的⼤数据项⽬。想⼀想Hadoop MapReduce,它⽤Java编写。HDFS 呢?也⽤Java来编写。连Sto
rm、Kafka和Spark都可以在JVM上运⾏(使⽤Clojure和Scala),这意味着Java是这些项⽬中的“⼀等公民”。另外还有像Google Cloud Dataflow(现在是Apache Beam)这些新技术,直到最近它们还只⽀持Java。
Java也许不是摇滚明星般备受喜爱的⾸选语⾔。但是由于研发⼈员在竭⼒理清Node.js应⽤程序中的⼀套回调,使⽤Java让你可以访问⼀个庞⼤的⽣态系统(包括分析器、调试器、监控⼯具以及确保企业安全和互操作性的库),以及除此之外的更多内容,⼤多数内容在过去⼆⼗年已久经考验(很遗憾,Java今年迎来21岁,我们都⽼矣)。
炮轰Java的⼀个主要理由是,⾮常繁琐冗长,⽽且缺少交互式开发所需的REPL(R、Python和Scala都有)。我见过10⾏基于Scala的Spark代码迅速变成⽤Java编写的变态的200⾏代码,还有庞⼤的类型语句,它们占据了屏幕的⼤部分空间。然⽽,Java 8中新的Lambda ⽀持功能对于改善这种情况⼤有帮助。Java从来不会像Scala那么紧凑,但是Java 8确确实实使得⽤Java进⾏开发不那么痛苦。
⾄于REPL?好吧,⽬前还没有。明年推出的Java 9会包括JShell,有望满⾜你的所有REPL要求。
哪种语⾔胜出?
你该使⽤哪种语⾔⽤于⼤数据项⽬?恐怕这还得“视情况⽽定”。如果你对晦涩的统计运算进⾏繁重的数
据分析⼯作,那么你不青睐R才怪。如果你跨GPU进⾏NLP或密集的神经⽹络处理,那么Python是很好的选择。如果想要⼀种加固的、⾯向⽣产环境的数据流解决⽅案,⼜拥有所有重要的操作⼯具,Java或Scala绝对是出⾊的选择。
当然,不⼀定⾮此即彼。⽐如说,如果使⽤Spark,你可以借助静态数据,使⽤R或Python来训练模型和机器学习管道(pipeline),然后对该管道进⾏序列化处理,倒出到存储系统,那⾥它可以供你的⽣产Scala Spark Streaming应⽤程序使⽤。虽然你不应该过分迷恋某⼀种语⾔(不然你的团队很快会产⽣语⾔疲劳),使⽤⼀套发挥各⾃所长的异构语⾔也许会给⼤数据项⽬带来成效。
在这⾥我还是要推荐下我⾃⼰建的⼤数据学习交流qq裙:522189307 , 裙 ⾥都是学⼤数据开发的,如果你正在学习⼤数据 ,⼩编欢迎你加⼊,⼤家都是软件开发党,不定期分享⼲货(只有⼤数据开发相关的),包括我⾃⼰整理的⼀份最新的⼤数据进阶资料和⾼级开发教程,欢迎进阶中和进想深⼊⼤数据的⼩伙伴。上述资料加可以领取
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论