Python 在Jupyter笔记本中从MySQL检索巨大的数据表
我目前正在尝试使用Jupyter笔记本从MySQL表中获取1亿行。我曾尝试使用为打开MySQL连接而提供的Python 在Jupyter笔记本中从MySQL检索巨大的数据表,python,mysql,jupyter-notebook,pymysql,Python,Mysql,Jupyter Notebook,Pymysql,我目前正在尝试使用Jupyter笔记本从MySQL表中获取1亿行。我曾尝试使用为打开MySQL连接而提供的pymysql.cursors。实际上,我已经尝试使用批处理来加快查询选择过程,因为要同时选择所有行太繁重了。下面是我的测试: import pymysql.cursors # Connect to the database connection = pymysql.connect(host='XXX', user='XXX',
pymysql.cursors
。实际上,我已经尝试使用批处理来加快查询选择过程,因为要同时选择所有行太繁重了。下面是我的测试:
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()
目前,测试应该只打印出每一行(或多或少不那么值钱),但我认为最好的解决方案是将所有内容存储在一个数据框中。
不幸的是,当我运行它时,出现了以下错误:
KeyError回溯(最近的呼叫
最后)在()
--->count=cursor.fetchone()[0]
关键错误:0
有人知道会有什么问题吗?
也许使用chunksize会更好?
提前谢谢
更新
我再次重写了代码,没有使用批处理大小并将查询结果存储在数据帧中。最后,它似乎正在运行,但由于数据量为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>
另一个更新
我可以通过迭代pd来输出结果
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
的数据帧
现在的问题是:
- 是否可以无限制地查询所有数据
- 究竟是什么影响了流程基准
您是否尝试过使用cursor.fetchone()
并检查结果?显然,这是一个dict
。Hi@9000我用一个print命令尝试了它,我得到了这样的结果:{u'count(*)':53885652}
这是mySQL表中的行数。如果我在没有[0]的情况下再次测试ti,我得到了这个结果:TypeError:需要一个整数,我认为它指的是偏移量。{u'count(*)':53885652}
是一个;您需要cursor.fetchone()['count(*')]
来访问该值。好的,我想我明白了字典的意思,现在如果我打印每一行,那么在这种情况下,ouptup看起来也像字典格式。如果我想将MySQL数据转换为数据帧格式,该怎么办?我再次尝试更新了这个问题。
<generator object _query_iterator at 0x11358be10>
ValueError: DataFrame constructor not properly called!
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)