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中的新功能几乎总是出现在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来编写。连Storm、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应用程序使用。虽然你不应该过分迷恋某一种语言(不然你的团队很快会产生语言疲劳),使用一套发挥各自所长的异构语言也许会给大数据项目带来成效。


本文作者:佚名

来源:51CTO

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
5天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
5天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
9天前
|
缓存 监控 Python
解密Python中的装饰器:优雅而强大的编程利器
Python中的装饰器是一种强大而又优雅的编程工具,它能够在不改变原有代码结构的情况下,为函数或类添加新的功能和行为。本文将深入解析Python装饰器的原理、用法和实际应用,帮助读者更好地理解和利用这一技术,提升代码的可维护性和可扩展性。
|
4天前
|
分布式计算 Hadoop 大数据
大数据技术与Python:结合Spark和Hadoop进行分布式计算
【4月更文挑战第12天】本文介绍了大数据技术及其4V特性,阐述了Hadoop和Spark在大数据处理中的作用。Hadoop提供分布式文件系统和MapReduce,Spark则为内存计算提供快速处理能力。通过Python结合Spark和Hadoop,可在分布式环境中进行数据处理和分析。文章详细讲解了如何配置Python环境、安装Spark和Hadoop,以及使用Python编写和提交代码到集群进行计算。掌握这些技能有助于应对大数据挑战。
|
25天前
|
编译器 测试技术 C++
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
153 0
|
18天前
|
机器学习/深度学习 人工智能 数据可视化
基于Python的数据可视化技术在大数据分析中的应用
传统的大数据分析往往注重数据处理和计算,然而数据可视化作为一种重要的技术手段,在大数据分析中扮演着至关重要的角色。本文将介绍如何利用Python语言中丰富的数据可视化工具,结合大数据分析,实现更直观、高效的数据展示与分析。
|
19天前
|
程序员 C语言 Python
Python列表推导式:简洁与高效的编程利器
在Python编程中,列表推导式(List Comprehension)是一种强大且优雅的工具,它允许我们以简洁的方式创建新的列表。列表推导式在Python程序员中广受欢迎,因为它能够将复杂的循环和条件语句简化为一行代码,提高代码的可读性和执行效率。
|
25天前
|
Java 编译器 Shell
【Python 基础教程 04】超详细Python编程教程:初学者入门至全面了解Python 解析器( CPython、IPython、Jython和PyPy)
【Python 基础教程 04】超详细Python编程教程:初学者入门至全面了解Python 解析器( CPython、IPython、Jython和PyPy)
42 0
|
26天前
|
SQL Java 关系型数据库
在Python中编写Java数据库驱动是不可能的
在Python中编写Java数据库驱动是不可能的
|
26天前
|
缓存 分布式计算 自然语言处理
Python语言的函数编程模块
Python语言的函数编程模块