Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Jupyter笔记本中从MySQL检索巨大的数据表_Python_Mysql_Jupyter Notebook_Pymysql - Fatal编程技术网

Python 在Jupyter笔记本中从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',

我目前正在尝试使用Jupyter笔记本从MySQL表中获取1亿行。我曾尝试使用为打开MySQL连接而提供的
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)