Почему для read_sql_table dask требуется параметр index_col? - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь использовать read_sql_table из dask, но у меня возникают некоторые проблемы, связанные с параметром index_col . Моя таблица sql не имеет никакого значения numeri c, и я не знаю, что дать параметру index_col .

Я прочитал в документации, что если index_col относится к типу «object». Я должен предоставить параметр «divisions», но я не знаю, какие значения находятся в моем index_col перед чтением таблицы.

Я действительно запуталась. Не знаю, почему я должен указывать index_col при использовании read_sql_table , но не обязательно при использовании read_csv .

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Я обнаружил, что в определенных ситуациях проще всего справиться с этим, рассредоточив DataFrame объекты в кластере с помощью pd.read_sql и его chunksize аргумента:

from dask import bag as db

sql_text = "SELECT ..."
sql_meta = {"column0": "object", "column1": "uint8"}
sql_conn = connect(...)
dfs_futs = map(client.scatter,               # Scatter each object to the cluster
               pd.read_sql(sql_text, 
                           sql_conn, 
                           chunksize=10_000, # Iterate in chunks of 10,000
                           columns=list(sql_meta.keys())))

# Now join our chunks (remotely) into a single frame.
df = db.from_sequence(list(dfs_futs)).to_dataframe(meta=sql_meta)              

Это приятно поскольку вам не нужно обрабатывать какие-либо потенциальные драйверы / пакеты, которые было бы неудобно управлять на распределенных узлах и / или в ситуациях, когда трудно легко разделить ваши данные.

Просто примечание о производительности для моего использования В этом случае мы используем операции внешней таблицы нашей базы данных для буферизации данных в CSV, а затем читаем это с помощью pd.read_csv (, это почти то же самое, что и выше ), а SELECT ... FROM ... WHERE по сравнению с тем, как Dask распараллеливает и разбивает запросы на части, может быть приемлемым с точки зрения производительности, поскольку выполнение разбиения на фрагменты внутри базы данных требует затрат.

0 голосов
/ 09 июля 2020

Dask нужен способ чтения разделов ваших данных независимо друг от друга. Это означает возможность формулировать запросы каждой части с помощью предложения типа «WHERE index_col> = val0 AND index_col list(string.ascii_letters). Вы также можете предоставить свои собственные полные предложения WHERE, если необходимо.

Обратите внимание, что OFFSET / LIMIT не работает для этой задачи, потому что

  • результат в целом не гарантируется для любых заданных входов (это поведение зависит от реализации базы данных c)
  • переход к некоторому конкретному смещению выполняется путем разбиения на страницы результатов запроса while, поэтому серверу приходится делать много времени объем необходимых работ
...