Dask Parquet загрузка файлов со схемой данных - PullRequest
0 голосов
/ 22 марта 2019

Это вопрос, связанный с этим сообщением .

Я экспериментирую с файлами Dask и Parquet. Я загрузил данные о нарушениях правил парковки в Нью-Йорке, которые скачал здесь .

Я читаю файлы данных, нахожу общие столбцы, применяю типы данных и сохраняю все впоследствии как коллекцию паркета

from dask import dataframe as dd
from dask.diagnostics import ProgressBar
import numpy as np

base_url = 'origin/nyc-parking-tickets/'

fy14 = dd.read_csv(base_url + '*2014_.csv')
fy15 = dd.read_csv(base_url + '*2015.csv')
fy16 = dd.read_csv(base_url + '*2016.csv')
fy17 = dd.read_csv(base_url + '*2017.csv')

data = [fy14, fy15, fy16, fy17]
col_set = [set(d.columns) for d in data]
common_columns = list(set.intersection(*col_set))

# Set proper column types
dtype_tuples = [(x, np.str) for x in common_columns]
dtypes = dict(dtype_tuples)

floats = ['Feet From Curb', 'Issuer Code', 'Issuer Precinct', 'Law Section', 'Vehicle Year', 'Violation Precinct']
ints32 = ['Street Code1', 'Street Code2', 'Street Code3', 'Summons Number']
ints16 = ['Violation Code']

for item in floats: dtypes[item] = np.float32
for item in ints32: dtypes[item] = np.int32
for item in ints16: dtypes[item] = np.int16

# Read Data
data = dd.read_csv(base_url + '*.csv', dtype=dtypes, usecols=common_columns) # usecols not in Dask documentation, but from pandas

# Write data as parquet
target_url = 'target/nyc-parking-tickets-pq/'
with ProgressBar():
    data.to_parquet(target_url)

Когда я пытаюсь перезагрузить данные

data2 = dd.read_parquet(target_url, engine='pyarrow')

Я получаю ValueError, а именно, что некоторые разделы имеют другой формат файла. Глядя на выходные данные, я вижу, что столбец «Правовой кодекс нарушения» в одном разделе интерпретируется как нулевой, предположительно потому, что данные слишком редки для выборки.

В посте с оригинальным вопросом предлагаются два решения. Первый - ввод фиктивных значений, другой - предоставление типов столбцов при загрузке данных. Я хотел бы сделать последнее, и я застрял. В методе dd.read_csv я могу передать аргумент dtype, для которого я просто ввожу словарь dtypes, определенный выше. dd.read_parquet не принимает это ключевое слово. В документации кажется, что categories берет на себя эту роль, но даже при прохождении categories=dtypes я все равно получаю ту же ошибку.

Как передать спецификации типа в dask.dataframe.read_parquet?

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Вы не можете передать dtypes в read_parquet, потому что файлы Parquet знают свои собственные dtypes (в CSV это неоднозначно). Dask DataFrame ожидает, что все файлы набора данных имеют одинаковую схему, по состоянию на 2019-03-26, поддержка загрузки данных смешанных схем отсутствует.

При этом вы можете сделать это самостоятельно, используя что-то вроде Dask Delayed, делать любые необходимые вам манипуляции для каждого файла, а затем конвертировать их в Dask DataFrame с помощью dd.from_delayed. Больше информации об этом здесь.

0 голосов
/ 01 апреля 2019

Кажется, проблема была в паркетном двигателе.Когда я изменил код на

data.to_parquet(target_url, engine = 'fastparquet')

и

data.from_parquet(target_url, engine = 'fastparquet')

, запись и загрузка работали нормально.

...