【问题标题】:pyarrow.lib.ArrowIOError: Invalid Parquet file size is 0 bytespyarrow.lib.ArrowIOError:无效的 Parquet 文件大小为 0 字节
【发布时间】:2020-02-27 00:18:41
【问题描述】:

我正在尝试执行类似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  

【问题讨论】:

    标签: python boto3 pyarrow


    【解决方案1】:

    这发生在我身上,因为空的“成功”文件与我的镶木地板文件具有相同的 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)
    

    【讨论】:

      【解决方案2】:

      我认为答案与此有关,来自Apache Arrow docs

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

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

      所以我认为文件名的自动发现仅在您尝试获取的文件被分区时才有效,例如蜂巢。

      【讨论】:

        猜你喜欢
        • 2013-10-03
        • 2022-08-05
        • 1970-01-01
        • 2015-03-17
        • 2016-05-11
        • 1970-01-01
        • 2012-01-27
        相关资源
        最近更新 更多