首页 > 解决方案 > 从 oracle sql 中检索大表到 pandas 的有效方法

问题描述

我在 oracle sql 中有一个包含 20 亿行的表,我要将这些数据加载到 pandas 数据框中。我有足够的内存空间(~64GB)并使用英特尔傲腾作为交换空间内存问题。我面临的问题是加载数据需要很长时间。

目前,我正在使用以下查询。

query = """select /*+parallel(35)*/ * from twistdw"""
df = pd.read_sql(query, conn)

该脚本需要永远运行。

我也试过

chunk_size = 5000000
offset = 0
dfs=[]
while True:
    query = """select /*+parallel(35)*/ * from twistdw;""" 
    dfs.append(psql.read_sql(query, conn_twist, chunksize=chunk_size))
    offset += chunk_size
    if len(dfs[-1]) < chunk_size:
        break
full_df = pd.concat(dfs)

上面的查询抛出一个错误:

Traceback (most recent call last):

  File "<ipython-input-13-c133ce6f47b0>", line 14, in <module>
    if len(dfs[-1]) < chunk_size:

TypeError: object of type 'generator' has no len()

我能得到一些帮助吗?

标签: sqlpandasdataframe

解决方案


如果chunksize指定,则read_sql返回一个迭代器:

chunk_size = 5000000
query = """select /*+parallel(35)*/ * from twistdw;""" 

reader = pd.read_sql(query, conn_twist, chunksize=chunk_size)
full_df = pd.concat(reader, ignore_index=True)

另请参阅有关按块读取数据的文档


推荐阅读