python - 从 SQL 服务器获取百万条记录并保存到 pandas 数据框
问题描述
我正在尝试从 SQL 服务器数据库中获取数据(只是一个简单的SELECT * 查询)。
该表包含大约 3-5 百万条记录。直接使用 SSMS 在 SQL 服务器上执行 SELECT * 大约需要 11-15 分钟。
但是,当我通过 Python 连接并尝试将数据保存到 pandas 数据框中时,它需要很长时间。1个多小时。
这是我正在使用的代码:
import pymssql
import pandas as pd
startTime = datetime.now()
## instance a python db connection object- same form as psycopg2/python-mysql drivers also
conn = pymssql.connect(server=r"xyz", database = "abc", user="user",password="pwd")
print ('Connecting to DB: ',datetime.now() - startTime )
stmt = "SELECT * FROM BIG_TABLE;"
# Excute Query here
df_big_table = pd.read_sql(stmt,conn)
必须有办法以更好的方式做到这一点?也许并行处理或快速获取数据的东西。
我的最终目标是将此表从 SQL 服务器迁移到 PostGres。
这就是我正在做的方式:
- 使用 python 从 SQL Server 获取数据
- 将其保存到熊猫数据框
- 将此数据以 CSV 格式保存到磁盘。
- 将 CSV 从磁盘复制到 Postgres。
很可能,我可以结合步骤 3,4,以便我可以在内存中进行转换,而不是使用磁盘 IO。
有许多复杂性,例如表约束和定义等。我稍后会注意。我不能使用第三方工具。
我被困在第 1,2 步。因此,对于 Python 脚本/其他一些开源语言的帮助将不胜感激。
如果还有其他方法可以达到我的最终目标,我欢迎提出建议!
解决方案
您是否尝试过使用 pandas.read_sql 的“chunksize”选项?您可以将所有这些内容放入一个数据框中并生成 csv。
如果需要更多时间,则可以使用 pandas.read_sql 作为迭代器将每个块拆分为多个文件,然后在完成工作后将这些文件合并为一个文件并将其提交给 postgres。
推荐阅读
- jq - JQ:根据对象名称从嵌套数组中的对象中提取值
- php - 使用 Laravel 6.20.27 (PHP v7.4.19) 的 Sentry v2.10 的 SSL 错误
- google-sheets - 如何根据谷歌表格中每日更新的数据之间的差异创建累积报告?
- java - 如何获取控制器中异步服务返回的数据(Java)
- security - Wildfly 25 快速入门 ee-security
- php - Laravel auth() 在 ajax 请求中不起作用
- javascript - 如何获取flexbox中一行的高度
- c# - 控制台应用程序消息未显示
- azure - 添加对 Azure Blob 存储的 nlog 支持后,Xamarin 版本构建失败
- c - rand() 函数给出一个 32 位随机无符号整数