【问题标题】:CSV to SQL Server: bulk import nightmare (T-SQL and/or Pandas)CSV 到 SQL Server:批量导入噩梦(T-SQL 和/或 Pandas)
【发布时间】:2020-10-18 16:00:12
【问题描述】:

我正在尝试将 .CSV 文件批量插入 SQL Server,但没有取得多大成功。

一点背景:

1. 我需要将 1600 万条记录插入 SQL Server (2017) 数据库。每条记录有 130 列。我在.CSV 中有一个字段,来自我们的一个供应商的 API 调用,我不允许提及。我有整数、浮点数和字符串数据类型。

2. 我尝试了通常的方法:BULK INSERT,但我无法通过数据类型错误。我发布了一个问题here,但无法解决问题。

3. 我尝试使用 python 进行试验,并尝试了我能找到的所有方法,但 pandas.to_sql 对每个人都警告说它非常慢。我遇到了数据类型和字符串截断错误。与BULK INSERT的不同。

4. 没有太多选择,我尝试了pd.to_sql,虽然它没有引发任何数据类型或截断错误,但由于我的 tmp SQL 数据库空间不足而失败。尽管我有足够的空间并且我的所有数据文件(和日志文件)都设置为无限制的自动增长,但我也无法传递此错误。

我当时就卡住了。我的代码(pd.to_sql 部分)很简单:

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("mssql+pyodbc://@myDSN")

df.to_sql('myTable', engine, schema='dbo', if_exists='append',index=False,chunksize=100)

我不确定还有什么可以尝试的,欢迎任何建议。我见过的所有代码和示例都处理小型数据集(列不多)。我愿意尝试任何其他方法。我将不胜感激。

谢谢!

【问题讨论】:

  • Stack Overflow 是一个问答网站。回答自己的问题并没有错,但是,不要在问题中发布答案和问题。这实际上缺少一个问题,并且像博客一样写;这不是堆栈溢出的用途。如果您确实想分享您尝试解决的问题以及完全受欢迎的答案,但您需要通过发布可回答的问题,然后您自己的答案作为答案来做到这一点。
  • 为了符合 StackOverflow 的格式,您可以同时编写问题和答案
  • 好吧,让我编辑这个。做到这一点!谢谢!
  • 参见Can I answer my own question? 和(更重要的是)链接的博客It’s OK to Ask and Answer Your Own Questions。就目前而言,这更有可能被锁定并收到反对票,因为它不符合 Stack Exchange 网络和 Stack Overflow 的问题指南。
  • 谢谢@Larnu。我改变了格式:分开的问题和答案。我可以删除整个帖子。我只是想分享。

标签: python sql-server pandas bulkinsert pandas-to-sql


【解决方案1】:

我只是想分享这段肮脏的代码,以防万一它对其他人有所帮助。请注意,我很清楚这根本不是最优的,它很慢,但我能够在十分钟内插入大约 1600 万条记录,而不会使我的机器过载。

我尝试使用以下方法小批量进行:

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("mssql+pyodbc://@myDSN")

a = 1
b = 1001

while b <= len(df):
    try:
        df[a:b].to_sql('myTable', engine, schema='dbo', if_exists='append',index=False,chunksize=100)
        a = b + 1
        b = b + 1000
    except:
        print(f'Error between {a} and {b}')
        continue

丑得要命,但对我有用。

我愿意接受所有批评和建议。正如我所提到的,我发布此内容以防它对其他人有所帮助,但也期待收到一些建设性的反馈。

【讨论】:

    【解决方案2】:

    将数据从 pandas 数据帧加载到 SQL 数据库非常慢,在处理大型数据集时,内存不足是常见的情况。在处理大型数据集时,您需要比这更有效的东西。

    d6tstack 可能会解决您的问题。因为它适用于本机数据库导入命令。它是一个自定义库,专门用于处理模式以及性能问题。适用于 XLS、CSV、TXT,可导出为 CSV、Parquet、SQL 和 Pandas。

    【讨论】:

    • 谢谢@Dashrath。看起来很有希望。我会试试看。
    • @Wilmar,你可能需要做一些额外的头脑风暴。原因是,我上次使用这个库时,它在 PostgreSQL 和 MySQL 上是稳定的,但在 MSSQL 上处于实验状态,但现在已经有一段时间了,我相信社区现在应该已经修复了。祝你好运。如果卡在任何地方,请随时在这里发表评论,这东西不太好,但一定会尽力提供帮助。
    【解决方案3】:

    我认为df.to_sql 非常棒!我最近一直在使用它。当数据集非常庞大时,它有点慢。如果您需要速度,我认为批量插入将是最快的选择。您甚至可以分批完成这项工作,这样您就不会耗尽内存,也不会让您的机器不堪重负。

    BEGIN TRANSACTION
    BEGIN TRY
    BULK INSERT  OurTable 
    FROM 'c:\OurTable.txt' 
    WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', 
       ROWS_PER_BATCH = 10000, TABLOCK)
    COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
    ROLLBACK TRANSACTION
    END CATCH 
    

    【讨论】:

      猜你喜欢
      • 2015-10-29
      • 1970-01-01
      • 2017-02-06
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2017-05-30
      • 1970-01-01
      相关资源
      最近更新 更多