如何解决没有元数据的Dask read_parquet分区
假设我有一个S3存储桶,其中存储了分区数据。如:
import pandas as pd
import dask.dataframe as dd
data_path = 's3://bucket/prefix'
df = pd.DataFrame({'lines': [0,1,1],'area': [1,20,20],'values': [0.1,0.2,1.1,1.2]})
dd.from_pandas(df,npartitions=2).to_parquet(data_path,partition_on=['lines','area'])
这将在s3中生成如下目录结构:
bucket/prefix
|__lines=0
|__area=1
|__ <file>
|__lines=1
|__area=20
|__ <file>
|__ _common_metadata
|__ _metadata
当我使用dask
阅读此内容时,一切正常,因为我也使用dask
保存了它
dd.read_parquet('s3://bucket/prefix').compute()
values lines area
0 0.1 0 1
1 0.2 0 1
2 1.1 1 20
3 1.2 1 20
如何
我的实际数据是从外部生成的(通过redshift),并且不包括_metadata
和_common_metadata
文件。这导致两个问题。
问题1
我必须在前缀下找到所有文件,否则会出错。这会导致错误:
dd.read_parquet('s3://bucket/prefix').compute()
~/anaconda3/envs/mars/lib/python3.7/site-packages/dask/dataframe/io/parquet/utils.py in _analyze_paths(file_list,fs,root)
405 path_parts_list = [_join_path(fn).split("/") for fn in file_list]
406 if root is False:
--> 407 basepath = path_parts_list[0][:-1]
408 for i,path_parts in enumerate(path_parts_list):
409 j = len(path_parts) - 1
IndexError: list index out of range
问题2
找到所有位于前缀下的文件,并给read_parquet
提供列表之后,我没有得到分区列(行,区域),而只有values
列:
subfiles = ['s3://bucket/prefix/lines=0/area=1/file','s3://bucket/prefix/lines=1/area=20/file']
dd.read_parquet(subfiles).compute()
values
0 0.1
1 0.2
2 1.1
3 1.2
关于如何在read_parquet
中保持行为的任何想法,好像其中都包含图元文件,这样我就可以拥有分区列,并且也许不必在文件夹中找到所有子文件?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。