Polars – 从S3读取Parquet只读取第一个文件

huangapple go评论64阅读模式
英文:

Polars - Glob read Parquet from S3 only read first file

问题

我尝试从S3中使用Polars读取一些Parquet文件。

这些文件是由Redshift使用UNLOAD和PARALLEL ON生成的。

这4个文件是:0000_part_00.parquet0001_part_00.parquet0002_part_00.parquet0003_part_00.parquet

当我使用:pl.read_parquet("s3://my_bucket/my_folder/*.parquet")时,它只返回第一个文件(0000_part_00.parquet)的结果,共340行。

奇怪的是,在本地运行相同的命令:pl.read_parquet("*.parquet"),会返回所有的行,共1239行。

这是正常行为还是我漏掉了什么?

英文:

I try to read some Parquet files from S3 using Polars.

Those files are generated by Redshift using UNLOAD with PARALLEL ON.

The 4 files are : 0000_part_00.parquet, 0001_part_00.parquet, 0002_part_00.parquet, 0003_part_00.parquet

When I use : pl.read_parquet("s3://my_bucket/my_folder/*.parquet"), it returns the result for only the first file (0000_part_00.parquet) -> 340 rows.

Weird thing is that running the same command locally : pl.read_parquet("*.parquet"), will return all the rows -> 1239 rows.

Is it normal behavior or I am missing something here ?

答案1

得分: 1

> 这是正常行为还是我漏掉了什么?

这是正常的,但你漏掉了一些东西。

从文档中可以看到:

> 参数
> ----------
> source
> 文件的路径,或类似文件的对象。如果路径是一个目录,将使用该目录作为分区感知扫描。
> 如果安装了 fsspec,它将用于打开远程文件。

对于你的本地系统,它将识别它为一个目录并使用分区感知扫描。对于访问s3,它使用了fsspec,并且在路径中不会真正识别 *

相反,请使用:

import pyarrow.dataset as ds
import fsspec #或者其他s3的封装
s3fs=fsspec.filesystem('s3', connection_string="xxxx")
myds=ds.dataset("s3://my_bucket/my_folder/", filesystem=s3fs)
df = pl.scan_pyarrow_dataset(myds).collect()
英文:

> Is it normal behavior or I am missing something here ?

That's normal and you're missing something.

From the docs:

> Parameters
> ----------
> source
> Path to a file, or a file-like object. If the path is a directory, that
> directory will be used as partition aware scan.
> If fsspec is installed, it will be used to open remote files.

In the case of your local system, it identifies that as a directory and uses a partition aware scan. For accessing s3, it uses fsspec and doesn't really recognize the * in the path.

Instead do:

import pyarrow.dataset as ds
import fsspec #or whatever the s3 wrapper is called
s3fs=fsspec.filesystem('s3', connection_string="xxxx")
myds=ds.dataset("s3://my_bucket/my_folder/", filesystem=s3fs)
df = pl.scan_pyarrow_dataset(myds).collect()

huangapple
  • 本文由 发表于 2023年3月31日 03:09:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/75892091.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定