为什么DataBricks的Spark在Python中运行的速度比Scala快一点

时间:2019-05-21 21:25:52

标签: python scala apache-spark apache-spark-sql databricks

对于我的Azure DataBrick,我创建了两个笔记本ExtractorPython和ExtractorScala,分别用Python和Scala编写。它们分别将笔记本称为DocumentationPython和DocumentationScala。

在两个Allergies笔记本中,示例代码将检查是否存在表ProblemData。如果是这样,它将把其他4个表连接在一起以插入到主表文档中。该表的大小从6 MB到2800 MB不等。这是Python中的示例文档代码:

IfExtsDf = sqlContext.sql("SHOW TABLES LIKE 'ProblemData '")

#If ProblemData exists then insert data from query into Documentation
if IfExtsDf.head(1):
  spark.sql(
  "INSERT INTO Documentation "+
  "SELECT " +
  "EPA.Field1, " +
  "msa.Field2, " +
  "RAM.Field3 " +
  "FROM ProblemData AS EPA " + 
  "INNER JOIN MedicalRecordNumbers AS msa ON " + 
  "  msa.MisAllrgID = EPA.AllergenID AND " + 
  "  msa.SourceID   = EPA.SourceID AND " + 
  "  msa.EhrId      = EPA.EhrId " + 
  "LEFT JOIN  Staging_Main AS RAM ON " + 
  "  RAM.PatientID = EPA.PatientID AND " + 
  "  RAM.SourceID  = EPA.SourceID AND " + 
  "  RAM.EhrId     = EPA.EhrId" 
  )

该查询比在Documentation表中具有8个常规插入和3个条件插入的查询更为复杂,但是我所显示的内容不胜于此。 这是Python中的基本提取器代码:

#Run DocumentationPython
dbutils.notebook.run("DocumentationPython",0)

这是我的两个节点的Spark集群配置:

cluster

这是在几分钟内针对Python与Scala进行多次运行的速度测试:

ExtractorPython :3.22分钟

DocumentationPython :2.78分钟

ExtractorScala :3.24分钟

DocumentationScala :2.88分钟

这是我将群集扩展到6个节点时的速度测试:

ExtractorPython :2.22分钟

DocumentationPython :1.95分钟

ExtractorScala :分钟

DocumentationScala :1.98分钟

我已经读过Scala应该比Python快。某些articles表示速度要快10倍。我的测试表明没有差异,Python的速度稍快。为什么会这样?

此外,为什么从另一个笔记本中调用一个笔记本平均要花20秒的时间,例如从ExtractorPython中调用DocumentationPython?

1 个答案:

答案 0 :(得分:0)

Scala代码比Python快的原因之一是因为Scala代码已预编译为Bytecode。在数据块中,每个代码时钟都是在运行时编译的,并且没有预定义的JAR。

出于这个原因,我认为,在笔记本环境中,Scala / Java的任何编译语言都比Python等解释型语言失去任何优势。