在Jupyter笔记本

时间:2018-04-17 13:17:54

标签: python mysql jupyter-notebook pymysql

我目前正在尝试使用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的数据框。

现在的问题是:

  • 是否可以在没有LIMIT的情况下查询所有数据?
  • 究竟是什么影响了流程基准?

0 个答案:

没有答案