Python - 使用Python从Oracle / Netezza服务器下载20 GB的数据集/数据转储到我的本地磁盘驱动器

时间:2015-10-27 09:13:32

标签: python oracle oracle11g large-data

需要以下任务的帮助:

我想从Oracle服务器(oracle 11g数据库)下载20GB的数据集/数据转储到我的本地磁盘驱动器(即E:/ python /)。我想用Python 3.4(windows64位;我正在使用Anaconda - spyder IDE)实现这一目标

我使用以下查询正常使用SAS:

LIBNAME ORACLE ODBC DSN= oracle UID= user PWD= password; #CONNECTION TO SERVER
LIBNAME LOCAL "E:/PYTHON"; #SETTING LOACAL PATH FOR DATA STORE

CREATE TABLE LOCAL.MYnewTable AS
SELECT * FROM ORACLE.DOWLOAD_TABLE
;QUIT;

以上查询将使用SAS从服务器下载20GB的datadump到我的本地E:/驱动器。如何在Python中做同样的事情?我的RAM只有4GB,所以在Pandas的数据框中下载整个20gb数据集会占用RAM(我相信!!我可能错了)。 SAS非常容易完成这项任务。请建议Python的查询。请求大家分享代码。

谢谢!

1 个答案:

答案 0 :(得分:0)

奥基!所以已经解决了我自己的问题:这也可以使用cxOracle来完成,但我使用的是Python 3.5,显然cxOracle for python 3.5不可用(据我所知)这就是为什么我使用了" pyodbc& #34;封装

import csv
import pyodbc
conn = pyodbc.connect('''DRIVER=<<name of server connection in ODBC driver>>;
                  SERVER= <<server IP>> i.e.: <<00.00.00.00>>;
                  PORT= <<5000>>;
                  DATABASE=<<Server database name>>;
                  UID= <<xyz>>;
                  PWD= <<****>>;''')


# needs to be at the top of your module

def ResultIter(cursor, arraysize=1000):
'An iterator that uses fetchmany to keep memory usage down'
    while True:
        results = cursor.fetchmany(arraysize)
        if not results:
           break
        for result in results:
           yield result


# where con is a DB-API 2.0 database connection object
cursor = conn.cursor()
cursor.execute('select * from <<table_name>>')


csvFile = open('stored_data_fetched_file.csv', 'a')
csvWriter = csv.writer(csvFile)

for result in ResultIter(cursor):
    csvWriter.writerow(result)

csvFile.close()

这也可以用于Netezza连接。已经过试用和测试。