scala和python之间的API兼容性?

时间:2013-06-21 13:47:35

标签: apache-spark

我已阅读了十几页文档,似乎:

  1. 我可以跳过学习scala部分

  2. API完全在python中实现(我不需要学习任何东西的scala)

  3. 交互模式与scala shell完全一样快,故障排除同样容易

  4. 像numpy这样的python模块仍然会被导入(没有残缺的python环境)

  5. 是否存在使得无法实现的空缺区域?

2 个答案:

答案 0 :(得分:8)

在最近的Spark版本(1.0+)中,我们已经实现了下面列出的所有缺少的PySpark功能。仍然缺少一些新功能,例如GraphX的Python绑定,但其他API已实现接近奇偶校验(包括用于Spark Streaming的实验性Python API)。

我之前的答案转载如下:

Spark 0.9的原始答案

自我原来的答案(在这个答案的底部再现)后的七个月里,已经发生了很多变化:

从Spark 0.9开始,PySpark中缺少的主要功能是:

尽管我们已经进行了许多性能改进,但Spark的Scala和Python API之间仍存在性能差距。 Spark用户邮件列表an open thread讨论了当前的性能。

如果您发现PySpark中缺少任何功能,请在我们的JIRA issue tracker上打开一张新票。

Spark 0.7.2的原始答案:

Spark Python Programming Guide有一个缺少PySpark功能的列表。从Spark 0.7.2开始,PySpark目前缺少对不同StorageLevels的sample(),sort()和持久性的支持。它还缺少一些添加到Scala API的便捷方法。

Java API在发布时与Scala API同步,但从那时起添加了许多新的RDD方法,并且并非所有这些方法都已添加到Java包装器类中。有关如何在https://groups.google.com/d/msg/spark-developers/TMGvtxYN9Mo/UeFpD17VeAIJ保持Java API最新的讨论。在那个帖子中,我提出了一种自动查找缺失特征的技术,所以只需要花时间添加它们并提交拉取请求即可。

关于性能,PySpark将比Scala Spark慢。性能差异的一部分源于在使用大堆分叉进程时出现奇怪的JVM问题,但有一个open pull request应该解决这个问题。另一个瓶颈来自序列化:现在,PySpark不要求用户为其对象显式注册序列化程序(我们目前使用二进制cPickle加上一些批处理优化)。在过去,我考虑添加对用户可自定义的序列化程序的支持,这些序列化程序允许您指定对象的类型,从而使用更快的专用序列化程序;我希望在某个时候恢复这方面的工作。

PySpark使用常规的cPython解释器实现,因此像numpy这样的库应该可以正常工作(如果PySpark是用Jython编写的,情况就不是这样了。)

开始使用PySpark非常容易;只需downloading a pre-built Spark package并运行pyspark解释器即可在您的个人计算机上进行测试,并让您评估其互动功能。如果您想使用IPython,可以在shell中使用IPYTHON=1 ./pyspark来启动带有IPython shell的Pyspark。

答案 1 :(得分:2)

我想补充一些问题,说明为什么许多使用这两种API的人都推荐使用Scala API。如果不指出Python与Scala的一般弱点以及我自己对动态类型和解释语言的厌恶来编写生产质量代码,我就很难做到这一点。所以这里有一些特定于用例的原因:

  1. 性能永远不会像Scala那样好,不是顺序,而是分数,这部分是因为解释了python。随着Java 8和JIT技术成为JVM和Scala的一部分,这种差距可能会在未来扩大。

  2. Spark是用Scala编写的,因此在Scala中调试Spark应用程序,了解Spark如何工作以及学习如何使用Spark要容易得多,因为你可以很容易地将CTRL + B插入到源代码中并阅读较低版本Spark的水平来说明正在发生的事情。我发现这对于优化作业和调试更复杂的应用程序特别有用。

  3. 现在我的最后一点似乎只是Scala与Python的争论,但它与特定用例高度相关 - 即 scale 并行处理 。 Scala实际上代表可扩展语言,许多人将其解释为意味着它是专为扩展和简单多线程而设计的。它不仅仅是关于lambda的,它是Scala的脚趾功能,使其成为执行大数据和并行处理的完美语言。我有一些习惯于Python并且不想学习新语言的数据科学朋友,但坚持他们的锤子。 Python是一种脚本语言,它不是为这个特定的用例而设计的 - 它是一个很棒的工具,但对于这个工作是错误的。结果在代码中显而易见 - 它们的代码通常比我的Scala代码长2到5倍,因为Python缺少很多功能。此外,他们发现更难以优化他们的代码,因为他们远离底层框架。

  4. 让我这样说吧,如果有人同时了解Scala和Python,那么他们几乎总会选择使用Scala API。唯一使用Python的人就是那些根本不想学习Scala的人。