CSV 到 SQL 服务器:批量导入噩梦 (T-SQL and/or Pandas)

CSV to SQL Server: bulk import nightmare (T-SQL and/or Pandas)

我正在尝试将 .CSV 文件批量插入 SQL 服务器,但没有成功。

一些背景知识:

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

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

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

4. 没有太多选择我尝试了 pd.to_sql 虽然它没有引发任何数据类型或截断错误但由于 运行 out space 在我的 tmp SQL 数据库中。尽管我有很多 space 并且我的所有数据文件(和日志文件)都设置为无限制自动增长,但我也无法通过此错误。

我当时卡住了。我的代码(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)

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

谢谢!

我只是想分享这段肮脏的代码,以防它能帮助到其他人。请注意,我非常清楚这根本不是最佳选择,速度很慢,但我能够在十分钟内插入大约 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

丑陋至极但对我有用。

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

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

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

的 XLS、CSV、TXT

我觉得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