pyarrow.lib.ArrowIOError:无效的Parquet文件大小为0字节

时间:2019-10-31 15:32:56

标签: python boto3 pyarrow

我正在尝试执行类似this的操作,将S3存储桶中的文件列表读取到pyarrow表中。

如果我指定文件名,我可以做:

from pyarrow.parquet import ParquetDataset
import s3fs
dataset = ParquetDataset(
    "s3://path/to/file/myfile.snappy.parquet,
    filesystem=s3fs.S3FileSystem(),
)

一切正常。但是,如果我这样做:

dataset = ParquetDataset(
    "s3://path/to/file,
    filesystem=s3fs.S3FileSystem(),
)

我得到:

pyarrow/_parquet.pyx:1036: in pyarrow._parquet.ParquetReader.open                                                                                                                                                                                                              
pyarrow.lib.ArrowIOError: Invalid Parquet file size is 0 bytes  

2 个答案:

答案 0 :(得分:2)

发生这种情况是因为空的“成功”文件与我的实木复合地板文件具有相同的S3前缀。我通过首先列出实木复合地板文件并仅选择名称以“ .parquet”结尾的文件来解决此问题:

from pyarrow.parquet import ParquetDataset
import s3fs

s3 = s3fs.S3FileSystem()

paths = [path for path in s3.ls("s3://path/to/file/") if path.endswith(".parquet")]

dataset = ParquetDataset(paths, filesystem=s3)

答案 1 :(得分:1)

我认为答案与Apache Arrow docs相关:

  

ParquetDataset类接受目录名称或列表或文件路径,并且可以发现和推断一些常见的分区结构,例如Hive产生的分区结构:

dataset = pq.ParquetDataset('dataset_name/')
table = dataset.read()

因此,我认为只有在您尝试保留的文件被例如以下文件分区时,文件名的自动发现才起作用。蜂巢。