使用 Python 从 Oracle 读取大量数据作为数据帧的最快方法

Posted

技术标签:

【中文标题】使用 Python 从 Oracle 读取大量数据作为数据帧的最快方法【英文标题】:Fastest way to read huge volume of data as dataframe from Oracle using Python 【发布时间】:2018-06-13 14:05:55 【问题描述】:

我需要从 Oracle 读取大量数据(大约 100 万和 450 列)并在 Greenplum 中进行批量加载。我正在使用以下方法:

import pandas as pd
from psycopg2 import *
from sqlalchemy import create_engine
import cx_Oracle
import sqlalchemy
import psycopg2 as pg
import io

engineor = create_engine('oracle+cx_oracle://xxxx:xxxx@xxxxx:xxxx/?service_name=xxxxx')
sql = "select * from xxxxxx"
enginegp = create_engine('xxxxx@xxxxx:xxxx/xxxx')
connection = enginegp.raw_connection()
output = io.StringIO()
for df in pd.read_sql(sql, engineor, chunksize=10000):
df.to_csv(output, header=False, index=False,mode='a')
output.seek(0)
cur = connection.cursor()
cur.copy_expert("COPY test FROM STDIN WITH CSV NULL '' ", output)
connection.commit()
cur.close()

我一直在分块读取数据:

for df in pd.read_sql(sql, engineor, chunksize=10000):
    df.to_csv(output, header=False, index=False,mode='a')

是否有一种更快、更无缝的方式从 Oracle 读取大表作为数据框?这种方法可以正常工作,并且由于与 Oracle 的连接有时会超时或被 DBA 终止,而且有时会成功运行,因此这种方法似乎并不无缝。考虑到表的大小,似乎不太可靠。我需要这个作为数据框,因为我需要稍后使用复制方法将它加载到 Greenplum。

【问题讨论】:

Greenplum是否支持数据库链接,然后可以直接连接Oracle和Greenplum,绕过Python加载数据? 【参考方案1】:

Outsourcer 是专门为做您想做的事情而创建的,但它是用 Java 编写的。

http://www.pivotalguru.com/?page_id=20

【讨论】:

我能够获得一台服务器进行安装。为 SQL Server 提供的链接不再有效。此外,Microsoft 似乎只支持 SQLJDBC 4.1 或更高版本。外包商寻找 4.0。有没有办法克服这个? os_path 文件中的 jar 文件 4.0 到 4.1 或反之亦然有效吗?或者因为我只需要 Oracle,我可以通过某种方式摆脱对 SQL Server 的需求吗? 您可以将较新的 4.1 SQL Server 驱动程序与 Outsourcer 一起使用,但如果您只使用 Oracle,则根本不需要 SQL Server jar 文件。 谢谢,我得到了它并生成了 UI 页面。但是,我收到 gpfdist 的此错误 - 错误:来自 gpfdist 的 http 响应代码 400(gpfdist://xxxxxxx:8010/foo#transform=sessions):HTTP/1.0 400 无效请求(不支持的输入 #transform)(url_curl.c: 454) (seg5 slice1 sdw1.gphd.local:1030 pid=419546) (cdbdisp.c:1322) 您使用的是什么版本的 Greenplum? gpfdist 上的转换选项已经存在了很长时间。 Greenplum 4.3.15.0 build 1.

以上是关于使用 Python 从 Oracle 读取大量数据作为数据帧的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE数据连接报错无法从套接字读取更多的数据怎么解决

从oracle数据库中导出大量数据到excel中为啥自动分成了好几个excel文件

Python连接Oracle,从安装到基本用法

oracle中只读取一条数据,怎么写

cx_Oracle.NotSupportedError:无法将 Python 值转换为数据库值

通过 MAPI 使用 Python 从 Outlook 读取电子邮件