Использование Chunksize и Dask для обработки таблицы Redshift 8 ГБ в Pandas с Missingno - PullRequest
0 голосов
/ 19 июня 2020

Я успешно подключил Python к таблице красного смещения с помощью Jupyter Notebook. Я выбрал 1 день данных (176707 строк) и выполнил функцию, используя Missingno , чтобы оценить, сколько данных отсутствует и где. Нет проблем.

Вот код (отредактированный для безопасности) ...

#IMPORT NECESSARY PACKAGES FOR REDSHIFT CONNECTION AND DATA VIZ
import psycopg2
from getpass import getpass
from pandas import read_sql
import seaborn as sns
import missingno as msno

#PASSWORD INPUT PROMPT
pwd = getpass('password')

#REDSHIFT CREDENTIALS 
config = { 'dbname': 'abcxyz', 
           'user':'abcxyz',
           'pwd':pwd,
           'host':'abcxyz.redshift.amazonaws.com',
           'port':'xxxx'
         }

#CONNECTION UDF USING REDSHIFT CREDS AS DEFINED ABOVE
def create_conn(*args,**kwargs):
    config = kwargs['config']
    try:
        con=psycopg2.connect(dbname=config['dbname'], host=config['host'], 
                              port=config['port'], user=config['user'], 
                              password=config['pwd'])
        return con
    except Exception as err:
        print(err)

#DEFINE CONNECTION 
con = create_conn(config=config)

#SQL TO RETRIEVE DATASET AND STORE IN DATAFRAME 
df = read_sql("select * from schema.table where date = '2020-06-07'", con=con)

# MISSINGNO VIZ
msno.bar(df, labels=True, figsize=(50, 20))

Это дает следующее, что я и хочу видеть:

enter image description here

Однако мне нужно выполнить эту задачу на подмножестве всей таблицы, а не только за один день.

Я запустил ...

SELECT "table", size, tbl_rows FROM SVV_TABLE_INFO  

... и я вижу, что таблица имеет общий размер 9 ГБ и 32,5 млн строк , хотя образец мне нужен для оценки данных завершение составляет 11M строк

Пока что я определил 2 варианта для получения большего набора данных, чем ~ 18k строк из моей первоначальной попытки.

Это:

1) Использование chunksize 2) Использование Dask

Использование Chunksize

Я заменил необходимую строку кода на это:

#SQL TO RETRIEVE DATASET AND STORE IN DATAFRAME 
df = read_sql("select * from derived.page_views where column_name = 'something'", con=con, chunksize=100000)

Это все еще заняло несколько часов на MacBook Pro с процессором Intel Core i7 2,2 ГГц и 16 ГБ ОЗУ, и к концу задачи выдавались предупреждения о памяти. Когда он был завершен, я все равно не смог просмотреть фрагменты, и ядро ​​отключилось, что означало, что данные, хранящиеся в памяти, были потеряны, и я, по сути, зря потратил утро.

Мой вопрос:

Если предположить, что это не совсем глупая sh попытка, может ли Даск быть лучшим подходом? Если да, то как я могу выполнить эту задачу с помощью Dask?

В документации Dask приводится следующий пример:

df = dd.read_sql_table('accounts', 'sqlite:///path/to/bank.db',
                  npartitions=10, index_col='id')  # doctest: +SKIP

Но я не понимаю, как я могу применить это к моему сценарию, в котором я подключились к таблице красных смещений, чтобы получить данные.

Любая помощь с благодарностью получена.

...