我正在尝试读取存储且公开可用的纽约数据集此处,我将 2022 年镶木地板文件的底层位置提取为“https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2019-01 .镶木地板”。现在我尝试从这个 URL 读取数据并使用
read_parquet
方法来轻松完成此操作。但我无法弄清楚如果数据大小太大并且可能导致内存过载,如何读取这些数据。与 read_csv
不同,它没有流选项,并且转换为 pyarrow.parquet.parquetfile
以使用其 iter_batches 功能似乎不是一个选项,因为它无法从 URL 读取
您可以使用过滤器选项根据时间戳仅加载文件的一部分:
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,因此每次调用它时可能都需要下载完整文件。
您实际上无法直接从 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