读取 Parquet 文件而不从 URL 读入内存(使用 Python)

问题描述 投票:0回答:2

我正在尝试读取存储且公开可用的纽约数据集此处,我将 2022 年镶木地板文件的底层位置提取为“https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2019-01 .镶木地板”。现在我尝试从这个 URL 读取数据并使用

read_parquet
方法来轻松完成此操作。但我无法弄清楚如果数据大小太大并且可能导致内存过载,如何读取这些数据。与
read_csv
不同,它没有流选项,并且转换为
pyarrow.parquet.parquetfile
以使用其 iter_batches 功能似乎不是一个选项,因为它无法从 URL 读取

python download stream parquet pyarrow
2个回答
0
投票

您可以使用过滤器选项根据时间戳仅加载文件的一部分:

pd.read_parquet(
'https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2019-01.parquet', 
filters=[
('tpep_pickup_datetime','>=',pd.Timestamp('2019-1-1T10:00')),
 ('tpep_pickup_datetime','<',pd.Timestamp('2019-1-1T11:00'))
])

但是,由于它是 https,因此每次调用它时可能都需要下载完整文件。


0
投票

您实际上无法直接从 url 读取内容,但此实现并不那么复杂,并且不会耗尽内存。这似乎有帮助:

import pyarrow.parquet as pq
import os
from urllib.parse import urlparse

base_url = 'https://d37ci6vzurychx.cloudfront.net/trip-data/green_tripdata_2022-01.parquet'
os.system(f"curl -O {base_url}")
path = urlparse(base_url).path
parquet_file_path = f"./{os.path.basename(path)}"
parquet_file = pq.ParquetFile(parquet_file_path)

从那里您可以使用

iter_batches
和其他选项。完整代码在这里:https://github.com/arthurfg/data-engineering-course/blob/main/week_1_basics_n_setup/docker_sql/parquet_to_postgres.py

© www.soinside.com 2019 - 2024. All rights reserved.