【问题标题】:Transfer huge dataframe to SQL Server table将巨大的数据帧传输到 SQL Server 表
【发布时间】:2019-10-29 17:22:17
【问题描述】:

我正在尝试将具有 1.5B 行的 DF 大容量复制到 SQL Server 表中。它只有 5 列,但行数很大。我正在尝试这种方法。

import com.microsoft.azure.sqldb.spark.bulkcopy.BulkCopyMetadata
import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._

val bulkCopyConfig = Config(Map(
  "url"               -> "mysqlserver.database.windows.net",
  "databaseName"      -> "MyDatabase",
  "user"              -> "username",
  "password"          -> "*********",
  "dbTable"           -> "dbo.Clients",
  "bulkCopyBatchSize" -> "100000",
  "bulkCopyTableLock" -> "true",
  "bulkCopyTimeout"   -> "600"
))

df.bulkCopyToSqlDB(bulkCopyConfig)

我正在按照下面链接中的示例进行操作。

https://docs.microsoft.com/en-us/azure/sql-database/sql-database-spark-connector

它持续运行几个小时,但从不将任何内容从 DF 复制到表中。想法?建议?谢谢。

顺便说一句,如果我尝试复制一个小得多的 DF,大约 150 万行,它工作得很好。

【问题讨论】:

  • 交易完成还是取消?表上有索引吗?
  • 建议您在导入时查看 sys.dm_exec_requests 以了解发生了什么。或者,您可以启动 XE 或分析器会话并观察命令完成以了解正在发生的事情。
  • 在目标数据库上安装whoisactive,看看发生了什么。 github.com/amachanic/sp_whoisactive

标签: azure apache-spark azure-sql-database


【解决方案1】:

根据我的经验,我认为您的问题是由bulkCopyBatchSize 参数的值引起的,正如官方文档Managing Bulk Copy Batch Sizes 所说的那样,但不是批量越大,性能越好。

批量复制大量行时,组成批处理的行数会对性能产生显着影响。批量大小的建议取决于正在执行的批量复制的类型。

  • 大容量复制到 SQL Server 时,指定 TABLOCK 大容量复制提示并设置大批量大小。

  • 当未指定 TABLOCK 时,将批处理大小限制为少于 1,000 行。

作为参考,请参阅SO线程What is the recommended batch size for SqlBulkCopy?的答案为bulkCopyBatchSize参数设置5000值重试。我认为它会获得比您当前更好的性能,因为更大的批量大小将花费更多的时间来批量发送网络数据包(包括更多重试数据包)以等待成功响应。

【讨论】:

  • 这有一个 scala 限制。关于实现这一目标的pythonic方式有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 2011-07-09
  • 2010-10-29
  • 2011-07-14
  • 1970-01-01
相关资源
最近更新 更多