我目前正在尝试使用Jupyter Notebook从MySQL表中获取1亿行。我已经尝试使用pymysql.cursors
来打开MySQL连接。实际上我已经尝试使用批处理来加速查询选择过程,因为选择所有行的操作太繁重。在我的测试下面:
import pymysql.cursors
# Connect to the database
connection = pymysql.connect(host='XXX',
user='XXX',
password='XXX',
db='XXX',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
print(cursor.execute("SELECT count(*) FROM `table`"))
count = cursor.fetchone()[0]
batch_size = 50
for offset in xrange(0, count, batch_size):
cursor.execute(
"SELECT * FROM `table` LIMIT %s OFFSET %s",
(batch_size, offset))
for row in cursor:
print(row)
finally:
connection.close()
目前测试应该打印出每一行(或多或少不值得),但我认为最好的解决方案是将所有内容存储在pandas数据框中。
不幸的是,当我运行它时,我收到了这个错误:
KeyError Traceback(最近一次调用 最后)in()
print(cursor.execute("SELECT count(*) FROM `table`"))
---> count = cursor.fetchone()[0]
batch_size = 50
KeyError:0
有人知道会出现什么问题? 也许使用 chunksize 会更好吗? 提前谢谢!
我再次重写了没有batch_size的代码,并将查询结果存储在pandas数据帧中。最后它似乎在运行但当然执行时间似乎非常“无限”,因为作为数据量的行为是100mln:
connection = pymysql.connect(user='XXX', password='XXX', database='XXX', host='XXX')
try:
with connection.cursor() as cursor:
query = "SELECT * FROM `table`"
cursor.execute(query)
cursor.fetchall()
df = pd.read_sql(query, connection)
finally:
connection.close()
加快这一过程的正确方法应该是什么?也许通过传递参数chunksize = 250
?
而且如果我尝试打印df
的类型,那么它输出的是生成器。实际上这不是数据框。
如果我打印df
,则输出为:
<generator object _query_iterator at 0x11358be10>
如何以数据帧格式获取数据?因为如果我打印fetch_all
命令,我可以看到查询的正确输出选择,所以在此之前一切都按预期工作。
如果我尝试将Dataframe()
与fetchAll
命令的结果一起使用,我会得到:
ValueError: DataFrame constructor not properly called!
我能够通过迭代pd.read_sql
输出结果:
for chunk in pd.read_sql(query, connection, chunksize = 250):
chunks.append(chunk)
result = pd.concat(chunks, ignore_index=True)
print(type(result))
#print(result)
最后我得到了一个名为result
的数据框。
现在的问题是: