我正在尝试执行类似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
答案 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()
因此,我认为只有在您尝试保留的文件被例如以下文件分区时,文件名的自动发现才起作用。蜂巢。