Использование Dask для чтения паркетных файлов из облачного хранилища Google

1

Я пытаюсь использовать Dask для чтения и записи из Google ковша. Использование кучи файлов csv работает, но неудобно (медленнее, не может сжиматься, не может читать только несколько столбцов), поэтому я попытался использовать формат apache parquet.

Написание, похоже, отлично работает:

import dask.dataframe as dd
pandas_df = pd.DataFrame({'x' : [2,3, 2], 'y': [1, 0, 0]})
dask_df = dd.from_pandas(pandas_df, npartitions=2)
dask_df.to_parquet("gcs://my_google_bucket/test/")

Но когда я пытаюсь его прочитать

read_again_df = dd.read_parquet("gcs://my_google_bucket/test/") 

Я получаю невыполненную ошибку:

AttributeError                            Traceback (most recent call last)
~/miniconda3/envs/env1/lib/python3.6/site-packages/dask/bytes/core.py in get_pyarrow_filesystem(fs)
    520     try:
--> 521         return fs._get_pyarrow_filesystem()
    522     except AttributeError:

AttributeError: 'DaskGCSFileSystem' object has no attribute '_get_pyarrow_filesystem'

During handling of the above exception, another exception occurred:

NotImplementedError                       Traceback (most recent call last)
<ipython-input-42-ef1fc41d04d5> in <module>()
----> 1 read_again = dd.read_parquet("gcs://my_google_bucket/test/")

~/miniconda3/envs/env1/lib/python3.6/site-packages/dask/dataframe/io/parquet.py in read_parquet(path, columns, filters, categories, index, storage_options, engine, infer_divisions)
    991 
    992     return read(fs, fs_token, paths, columns=columns, filters=filters,
--> 993                 categories=categories, index=index, infer_divisions=infer_divisions)
    994 
    995 

~/miniconda3/envs/env1/lib/python3.6/site-packages/dask/dataframe/io/parquet.py in _read_pyarrow(fs, fs_token, paths, columns, filters, categories, index, infer_divisions)
    505         columns = list(columns)
    506 
--> 507     dataset = pq.ParquetDataset(paths, filesystem=get_pyarrow_filesystem(fs))
    508     if dataset.partitions is not None:
    509         partitions = [n for n in dataset.partitions.partition_names

~/miniconda3/envs/env1/lib/python3.6/site-packages/dask/bytes/core.py in get_pyarrow_filesystem(fs)
    522     except AttributeError:
    523         raise NotImplementedError("Using pyarrow with a %r "
--> 524                                   "filesystem object" % type(fs).__name__)

NotImplementedError: Using pyarrow with a 'DaskGCSFileSystem' filesystem object

Я предполагаю, что это означает, что dask все еще не может напрямую считывать файлы паркета из облачной службы google. Есть ли какой-либо косвенный способ сделать эту работу, скажем, с использованием pyarrow?

Я хочу сохранить способность ленивой загрузки вещей, а затем использовать dask для преобразования данных.

Спасибо!

Теги:
google-cloud-storage
dask
parquet
pyarrow

1 ответ

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

Даск, конечно же, может прочитать паркет из GCS с помощью fastparquet backend (engine='fastparquet'). Обратите внимание, что pyarrow не _metadata файл _metadata, который ожидает fastparquet, поэтому вы можете либо записать свои данные с помощью fastparquet, создать файл из существующих файлов данных с помощью fastparquet, либо передать glob-строку, указывающую на все файлы данных, а не каталог.

То, что вы делаете, должно работать с pyarrow тоже, поскольку pyarrow обычно может принимать любой файл типа python, но в этом случае, похоже, пытается создать файловую систему pyarrow. Ошибка, которую вы видите выше, вероятно, является ошибкой и должна быть исследована.

-редактировать-

Согласно комментариям ОП, следующее работает

pandas_df = pd.DataFrame({'x' : [2,3, 2], 'y': [1, 0, 0]}) 
dask_df = dd.from_pandas(pandas_df, npartitions=2) 
dask_df.to_parquet("gcs://my_bucket/test", engine='fastparquet') 
read_again_df = dd.read_parquet("gcs://my_bucket/test/", engine='fastparquet')

Обратите внимание, что по какой-то dask_df.to_parquet() причине dask_df.to_parquet() нужно вызвать с помощью "gcs://my_bucket/test" без "/", иначе dd.read_parquet() не работает

  • 0
    Спасибо! Я попробую написать, а затем прочесть с помощью engine='fastparquet' и соответствующим образом обновить этот вопрос.
  • 0
    Можете ли вы обновить свой вопрос, чтобы включить это? Я приму это тогда. Следующие работы! pandas_df = pd.DataFrame ({'x': [2,3, 2], 'y': [1, 0, 0]}) dask_df = dd.from_pandas (pandas_df, npartitions = 2) dask_df.to_parquet ("gcs : // spike-kwik / test ", engine = 'fastparquet') read_again_df = dd.read_parquet (" gcs: // spike-kwik / test / ", engine = 'fastparquet') Обратите внимание, что это должен быть" gcs : // spike-kwik / test ", а не" gcs: // spike-kwik / test / ", иначе это не сработает!
Показать ещё 2 комментария

Ещё вопросы

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