最近,我在通过JDBC将Spark数据帧导出到数据库的两种方式之间遇到了很大的性能差异。该数据库是Exasol 6.0
第一种方法是通过普通的DataFrame.write函数,如下所示:
pyDF.write.format('jdbc')。options( url ='jdbc:...', driver ='com.exasol.jdbc.EXADriver', dbtable ='EDRIN.STG_TABLE', 用户='', password ='')。mode('append')。save()
第二种方法是先将数据帧注册为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。
有人可以解释运行时差异如此之大的原因吗?
最好的问候, 埃德林