从Oracle SQL检索大表到Pandas的有效方法

时间:2019-07-24 20:37:07

标签: sql pandas dataframe

我在oracle sql中有一个具有20亿行的表,并且我打算将该数据加载到pandas数据帧中。我有足够的内存空间(〜64GB),并使用Intel optane作为交换空间内存问题。我面临的问题是要花费很多时间来加载数据。

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

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()

我可以得到一些帮助吗?

1 个答案:

答案 0 :(得分:0)

如果指定了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)

另请参阅docs on reading data chunk by chunk