sql - Spark : optimise writing a DataFrame to SQL Server

标签 sql sql-server database scala apache-spark

我正在使用下面的代码将一个包含 43 列和大约 2,000,000 行的 DataFrame 写入 SQL Server 中的一个表中:

dataFrame
  .write
  .format("jdbc")
  .mode("overwrite")
  .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
  .option("url", url)
  .option("dbtable", tablename)
  .option("user", user)
  .option("password", password)
  .save()

遗憾的是,虽然它确实适用于小型数据帧,但它要么非常慢,要么对于大型数据帧超时。关于如何优化它的任何提示?

我试过设置 rewriteBatchedStatements=true

谢谢。

最佳答案

尝试将 batchsize 选项添加到至少 > 10000 的语句中(相应地更改此值以获得更好的性能)并再次执行写入.

From spark docs:

The JDBC batch size, which determines how many rows to insert per round trip. This can help performance on JDBC drivers. This option applies only to writing. It defaults to 1000.

也值得一试:

  • numPartitions option增加并行度(这也决定了JDBC最大并发连接数)

  • queryTimeout option 增加写入选项的超时时间。

关于sql - Spark : optimise writing a DataFrame to SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55708079/

相关文章:

sql - 全外连接与全连接

sql - 如何从sql查询中获取二进制数据?

c++ - 如何从 Oracle occi C++ api 记录原始 SQL?

java - 使用单个或优化查询进行批量插入

sql-server - SQL Server 全文搜索语法

java - JDBC ResultSet.absolute() 与 Limit

c# - 必须声明标量变量@

mysql - 如何简化带有很多 “case when then else …” 的 sql

mysql - 如何制作以下数据库表

sql-server - SQL Server Service Broker - 删除服务