org.apache.spark.sql.DataFrameWriter.save和org.apache.spark.sql.SparkSession.sql之间的性能差异

时间:2019-11-16 20:43:09

标签: apache-spark pyspark apache-spark-sql

最近,我在通过JDBC将Spark数据帧导出到数据库的两种方式之间遇到了很大的性能差异。该数据库是Exasol 6.0

  1. 第一种方法是通过普通的DataFrame.write函数,如下所示:

    pyDF.write.format('jdbc')。options(         url ='jdbc:...',         driver ='com.exasol.jdbc.EXADriver',         dbtable ='EDRIN.STG_TABLE',         用户='',         password ='')。mode('append')。save()

  2. 第二种方法是先将数据帧注册为Spark临时表,然后为SCHEMA.TBL1创建一个jdbc表,然后通过sqlContext.sql函数在Spark SQL中进行插入,如下所示:

    pyDF.registerTempTable('TMP_STG_TBL1')

    sqlContext.sql(“”“创建表spark_db.STG_TBL1                   使用org.apache.spark.sql.jdbc                   选项(                   驱动程序“ com.exasol.jdbc.EXADriver”,                   网址“ jdbc:exa:...”,                   用户“”,                   密码“”,                   dbtable“ EDRIN.STG_TABLE”,                   numpartitions 1                   批量100000)“”“)

    sqlContext.sql(“”“”插入到spark_db.STG_TBL1 SELECT * FROM TMP_STG_TBL1“”“)

运行时间有很大的不同,第一个运行时间大约需要18分钟,第二个运行时间大约需要5分钟。

在SparkUI中,两者的Dag可视化效果相同,不同之处在于第一种方法是调用org.apache.spark.sql.DataFrameWriter.save,而第二种方法是调用org.apache.spark.sql.SparkSession.sql。

有人可以解释运行时差异如此之大的原因吗?

最好的问候, 埃德林

0 个答案:

没有答案
相关问题