我有一个 parquet 文件,我想将文件中的前
n
行读取到 pandas 数据框中。
我尝试过的:
df = pd.read_parquet(path= 'filepath', nrows = 10)
它不起作用并给了我错误:
TypeError: read_table() got an unexpected keyword argument 'nrows'
我也尝试过
skiprows
参数,但这也给了我同样的错误。
或者,我可以读取完整的 parquet 文件并过滤前 n 行,但这将需要更多的计算,而我想避免这种情况。
有什么办法可以实现吗?
接受的答案已过时。现在可以只将 parquet 文件的前几行读入 pandas,尽管它有点混乱并且依赖于后端。
要使用 PyArrow 作为后端进行阅读,请按照以下步骤操作:
from pyarrow.parquet import ParquetFile
import pyarrow as pa
pf = ParquetFile('file_name.pq')
first_ten_rows = next(pf.iter_batches(batch_size = 10))
df = pa.Table.from_batches([first_ten_rows]).to_pandas()
更改行
batch_size = 10
以匹配您要读入的行数。
在探索并与 pandas 开发团队取得联系后,最终结果是 pandas 在读取 parquet 文件时不支持参数
nrows
或 skiprows
。
原因是 pandas 使用
pyarrow
或 fastparquet
parquet 引擎来处理 parquet 文件,并且 pyarrow
不支持部分读取文件或通过跳过行读取文件(不确定 fastparquet
)。以下是 pandas github 上的问题链接供讨论。
为了提供另一个视角,如果您熟悉 SQL,您可以考虑使用 DuckDB 来实现此目的。例如:
import duckdb
nrows = 10
file_path = 'path/to/data/parquet_file.parquet'
df = duckdb.query(f'SELECT * FROM "{file_path}" LIMIT {nrows};').df()
如果您使用分区镶木地板,上述结果将不包含任何分区列,因为该信息不存储在较低级别的文件中。相反,您应该将顶部文件夹标识为分区镶木地板数据集,并将其注册到 DuckDB 连接器:
import duckdb
import pyarrow.dataset as ds
nrows = 10
dataset = ds.dataset('path/to/data',
format='parquet',
partitioning='hive')
con = duckdb.connect()
con.register('data_table_name', dataset)
df = con.execute(f"SELECT * FROM data_table_name LIMIT {nrows};").df()
您可以使用连接器注册多个数据集以启用更复杂的查询。我发现 DuckDB 使处理 Parquet 文件变得更加方便,尤其是在尝试在多个 Parquet 数据集之间进行 JOIN 时。使用
conda install python-duckdb
或 pip install duckdb
安装
使用 pyarrow 数据集扫描仪:
import pyarrow.dataset as ds
n = 10
src_path = "/parquet/path"
df = ds.dataset(src_path).scanner().head(n).to_pandas()
对我来说最直接的选择似乎是使用
dask
库作为
import dask.dataframe as dd
df = dd.read_parquet(path= 'filepath').head(10)
作为替代方案,您可以使用AWS SDK for pandas中的S3 Select功能,如 Abdel Jaidi 在此答案中提出的。
pip 安装 awswrangler
import awswrangler as wr
df = wr.s3.select_query(
sql="SELECT * FROM s3object s limit 5",
path="s3://filepath",
input_serialization="Parquet",
input_serialization_params={},
use_threads=True,
)