使用Dask从Google云端存储中读取实木复合地板文件

时间:2018-09-24 15:46:39

标签: python google-cloud-storage parquet dask pyarrow

我正在尝试使用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进行数据转换的能力。

谢谢!

1 个答案:

答案 0 :(得分:3)

Dask当然可以通过fastparquet后端(engine='fastparquet')从GCS读取实木复合地板。请注意,pyarrow不会生成fastparquet期望的_metadata文件,因此您可以使用fastparquet编写数据,使用fastparquet从现有数据文件创建文件,或者传递指向所有数据文件而不是目录。

您所做的工作也应该与pyarrow一起使用,因为pyarrow通常可以接受任何类似python文件的对象,但是在这种情况下,似乎正在尝试制作pyarrow文件系统。您在上面看到的错误可能是一个错误,应进行调查。

-编辑-

根据OP的评论,以下内容确实有效

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()必须使用“ gcs:// my_bucket / test”而不是“ /”来调用,否则dd.read_parquet()不起作用< / p>