首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从多个目录中读取多个带有相同模式的拼花文件

如何从多个目录中读取多个带有相同模式的拼花文件
EN

Stack Overflow用户
提问于 2017-09-22 18:34:14
回答 3查看 9.4K关注 0票数 6

我需要使用dask将具有相同模式的多个拼花文件加载到单个数据帧中。当它们都位于同一个目录中时,这是可行的,但当它们位于单独的目录中时,则不起作用。

例如:

代码语言:javascript
复制
import fastparquet
pfile = fastparquet.ParquetFile(['data/data1.parq', 'data/data2.parq'])

工作正常,但如果我将data2.parq复制到另一个目录,则以下内容无法工作:

代码语言:javascript
复制
pfile = fastparquet.ParquetFile(['data/data1.parq', 'data2/data2.parq'])

我得到的回溯如下:

代码语言:javascript
复制
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-11-b3d381f14edc> in <module>()
----> 1 pfile = fastparquet.ParquetFile(['data/data1.parq', 'data2/data2.parq'])

~/anaconda/envs/hv/lib/python3.6/site-packages/fastparquet/api.py in __init__(self, fn, verify, open_with, sep)
     82         if isinstance(fn, (tuple, list)):
     83             basepath, fmd = metadata_from_many(fn, verify_schema=verify,
---> 84                                                open_with=open_with)
     85             self.fn = sep.join([basepath, '_metadata'])  # effective file
     86             self.fmd = fmd

~/anaconda/envs/hv/lib/python3.6/site-packages/fastparquet/util.py in metadata_from_many(file_list, verify_schema, open_with)
    164     else:
    165         raise ValueError("Merge requires all PaquetFile instances or none")
--> 166     basepath, file_list = analyse_paths(file_list, sep)
    167 
    168     if verify_schema:

~/anaconda/envs/hv/lib/python3.6/site-packages/fastparquet/util.py in analyse_paths(file_list, sep)
    221     if len({tuple([p.split('=')[0] for p in parts[l:-1]])
    222             for parts in path_parts_list}) > 1:
--> 223         raise ValueError('Partitioning directories do not agree')
    224     for path_parts in path_parts_list:
    225         for path_part in path_parts[l:-1]:

ValueError: Partitioning directories do not agree

在使用dask.dataframe.read_parquet时,我会得到相同的错误,假设使用相同的ParquetFile对象。

如何从不同的目录加载多个文件?将我需要加载的所有文件放入同一个目录不是一个选项。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-22 19:59:13

如果使用绝对路径或显式相对路径,这确实适用于主板上的快速拼板:

代码语言:javascript
复制
pfile = fastparquet.ParquetFile(['./data/data1.parq', './data2/data2.parq'])

对于领先的./的需求应该被认为是一个bug --参见问题。

票数 4
EN

Stack Overflow用户

发布于 2020-06-17 10:35:55

Dask文档指出:

要从多个文件中读取数据,可以传递一个全局字符串或路径列表.

下面的解决方案允许在单独的parquet文件中使用不同的列,这对于这个答案.It来说是不可能的,因为它是一个本机dask命令。

代码语言:javascript
复制
import dask.dataframe as dd


files = ['temp/part.0.parquet', 'temp2/part.1.parquet']
df = dd.read_parquet(files)

df.compute()
票数 4
EN

Stack Overflow用户

发布于 2017-09-22 19:04:30

解决方法是分别读取每个块并传递给dask.dataframe.from_delayed。这并不能完成与read_parquet完全相同的元数据处理(低于'index'的应该是索引),但否则应该可以工作。

代码语言:javascript
复制
import dask.dataframe as dd    
from dask import delayed    
from fastparquet import ParquetFile

@delayed
def load_chunk(pth):
    return ParquetFile(pth).to_pandas()

files = ['temp/part.0.parquet', 'temp2/part.1.parquet']
df = dd.from_delayed([load_chunk(f) for f in files])

df.compute()
代码语言:javascript
复制
Out[38]: 
   index  a
0      0  1
1      1  2
0      2  3
1      3  4
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46371182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档