Как вызвать данные в пакетах из оператора select и добавить в dataframe?

1

У меня есть файл с выражением sql, который я читаю в python, используя pyodbc. Оператор sql - это просто оператор select:

select distinct (columns) from table1

Однако данные, которые я вызываю, составляют 30 миллионов строк.

Я могу сделать это для небольших таблиц и поместить информацию в фреймворк данных.

Есть ли в любом случае пакетный оператор select, чтобы вытащить только X количество строк и добавить в dataframe и продолжать делать это до конца 30 миллионов записей?

код до сих пор:

import os.path
import pandas as pd
import tinys3
import psycopg2
import pyodbc
from datetime import datetime
import uuid
import glob
from os import listdir
from os.path import isfile, join
import time

startTime = datetime.now()

#reading in data for db
server = 'xxxx' 
database = 'xxx' 
username = 'xxx' 
password = 'xxxx' 
driver= '{ODBC Driver 17 for SQL Server}'
cnxn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=xxx;DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()
path = "path/to/folder"




for infile in glob.glob( os.path.join(path, '*.sql') ):
    with open(infile, 'r') as myfile:
        sql = myfile.read()
        print(sql)
        myfile.close()
        cursor.execute(sql)

        row = cursor.fetchall()
        columns = [column[0] for column in cursor.description]
        columns = [element.lower() for element in columns]

        df = pd.DataFrame([tuple(t) for t in row])
        df.columns = columns
Теги:
pandas
python-3.x
pyodbc

1 ответ

1
Лучший ответ

Вы можете использовать функцию fetchmany:

cursor.fetchmany([size = cursor.arraysize]) → список

Возвращает список оставшихся строк, содержащий не более строк размера, используемых для обработки результатов в кусках. Список будет пустым, если больше строк не будет.

Значение по умолчанию для cursor.arraysize равно 1, которое не отличается от вызова fetchone().

Исключение ProgrammingError возникает, если SQL не был выполнен или если он не возвращал результирующий набор (например, не был оператором SELECT).

Это позволит вам извлекать данные в виде кусков.

Пример использования:

while True:
    three_rows = cursor.fetchmany(3)
    # every loop cycle, 3 rows are selected
    if not results:
        break;
    print(three_rows)

Вы также можете использовать функцию fetchdone, чтобы обрабатывать данные по строкам.

fetchone

cursor.fetchone() → Строка или Нет

Возвращает следующую строку или None, когда больше данных не доступно.

  • 0
    будет ли cursor.fetchmany() идти туда, где у меня есть row = cursor.fetchall() ?
  • 0
    @RustyShackleford Я добавил пример. Вы не можете просто заменить fetchALL на fetchMANY, потому что вам, очевидно, нужно вызывать fetchmany один раз для каждого чанка, поэтому, вероятно, в цикле.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню