出于某种原因,pandas read_sql 的“chunksize”参数不能很好地与 AWS 数据 API 配合使用。顺便说一句,我正在使用 MySQL,但 pydataapi 应该同时支持两者。
我为这个问题找到的解决方案是使用 pandas 的read_sql和字符串格式的 LIMIT 迭代地查询数据库。这使用pydataapi python 包。
我首先使用语法得到了表格的长度
df_status = pd.read_sql('show table status like "yourtable";', con = sql_engine)
然后使用 numpy.arange() 确定请求的起始行。每个查询将在此处询问由 'chunksize' 参数指定的行数。我选择了 20,000,但您应该选择不会导致响应 > 1MB 的最高值。
然后只需连接数据帧列表即可。我发现这是目前最好的解决方案。
import pandas as pd
import numpy as np
import boto3
from sqlalchemy import create_engine
cluster_arn = 'yourcluster'
secret_arn = 'yoursecret'
database = 'mydb'
chunksize = 20000
rdsData = boto3.client('rds-data', region_name = 'yourregion')
sql_engine = create_engine('mysql+pydataapi://',
connect_args = {
'resource_arn': cluster_arn,
'secret_arn': secret_arn,
'database': database,
'client': rdsData}).connect()
df_status = pd.read_sql("show table status like 'yourtable';", con = sql_engine)
rownum = df_status.loc[0, "Rows"]
space = np.arange(0, rownum, chunksize)
space = space.tolist()
space.append(rownum)
df_list = []
for i in space:
df = pd.read_sql("select * from yourtable LIMIT {}, {}".format(i, chunksize), con = sql_engine)
df_list.append(df)
big_df = pd.concat(df_list)
sql_engine.close()