出现OSError:使用pyarrow ParquetDataset传递了非文件路径

问题描述

我必须在不同的环境上运行一些测试。在测试中,我必须检查s3中的某些目录以查找镶木地板文件,并将其像这样转移到字典中

import pyarrow.parquet as pq
import s3fs

env = 'dev'
aws_profile ={'dev': 'dev_aws_profile','qa': 'qa_aws_profile'}
def get_dictionary_from_parquet(file_name):
    fs = s3fs.S3FileSystem()
    pq_session = Session(profile_name=aws_profile[env])
    s3 = pq_session.resource('s3')
    parquet_bucket = s3.Bucket(f'valid-bucket-name-{env}')
    paths = []
    for pq_file in parquet_bucket.objects.filter(Prefix=f'valid-prefix-{env}'):
    if pq_file.key.endswith(file_name):
        paths.append(f's3://{pq_file.bucket_name}/{pq_file.key}')
    data_set = pq.ParquetDataset(paths,filesystem=fs)
    tbl = data_set.read()
    pq_dictionary = tbl.to_pydict()
    return pq_dictionary

如果aws凭证文件中的 aws_profile == 配置文件,则效果很好,但返回

line 14,in get_dictionary_from_parquet
    data_set = pq.ParquetDataset(paths,filesystem=fs)
  File "/Library/Python/3.7/site-packages/pyarrow/parquet.py",line 1170,in __init__
    open_file_func=partial(_open_dataset_file,self._Metadata)
  File "/Library/Python/3.7/site-packages/pyarrow/parquet.py",line 1365,in _make_manifest
    .format(path))    
OSError: Passed non-file path: s3://<valid path to parquet file>

如何将aws配置文件解析为pyarrow进行修复?

解决方法

在使用s3fs实例在读取时指定文件系统时,正在配置boto(3?)对象并对其进行文件过滤是很奇怪的。我建议同时使用s3fs

以下内容将解决该问题

fs = s3fs.S3FileSystem(profile=aws_profile[env])

但是我建议您也可以使用同一实例来列出文件

paths = fs.glob(f"valid-bucket-name-{env}/valid-prefix-{env}/*/file_name")

(或任何正确的glob模式-我在解析您的代码时遇到问题)。