Это вопрос, связанный с этим сообщением .
Я экспериментирую с файлами 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
?