PySpark vs Scala Spark vs Spark SQL -哪个性能更高效?udf仍然很糟糕吗?<



我读了很多博客,试图理解PySpark、ScalaSpark和Spark SQL中哪个性能更高效。以前,我知道ScalaSpark更好,因为Spark在JVM中运行,并且有Python<>JVM数据序列化/反序列化的开销,这使得Python效率较低。这仍然有效吗?

可以创建Scala udf吗?或者它们不是性能效率高,因为它不能被钨处理。

光子引擎如何在性能方面发挥作用?

我知道有人问过这些问题,但那好像是5年前的事了,现在Spark的世界发生了很多变化。

scala中的PySparkspark使用Spark SQL优化。理论上它们具有相同的性能。udf内部存在差异。在这里,PySpark缺乏强类型,这反过来不允许Spark SQL引擎优化类型。然而,pandas UDFs也有一个解决方案。它们允许类型信息,spark引擎可以使用pandas类型优化处理逻辑,就像在scala或java中一样。

在浏览了多个博客来了解Spark的工作原理并尝试了一些东西之后,我现在对Spark平台有了更好的了解。

因此,Spark使用JVM来运行转换,这意味着Scala和Java在Spark环境中是头等公民。它们通常效率更高。PySpark是通过运行一个与JVM通信的python进程来完成的,这使得它有一点开销。但是PySpark仍然只是Spark API的包装器,在JVM中运行,这意味着执行时间的差异接近于零。

只要数据留在JVM内(通过使用PySpark API),就没有性能问题。但是当我们使用普通的Python UDF时,数据在JVM和Python进程(序列化/反序列化)之间传输,导致巨大的性能差距。

与Python UDF相比,Pandas UDF是更好的选择,Python UDF使用Apache Arrow来优化数据传输过程,而对于Databricks,则使用Pyspark。但这再次导致数据在Python进程和JVM之间移动。因此,尽可能避免使用UDF是最好的方法。

如果无法避免,Scala UDF>熊猫f>Python UDF。

最新更新