如何将Pandas数据帧加载到QuestDB

译者 | 李睿

审校 | 重楼

简介

Pandas是一个开源的Python数据分析和数据操作库,如今已经成为数据科学家和分析师的必备工具。它提供了一种简单直观的数据操作方式,使其成为完成数据分析任务的热门选择。

尽管Pandas在中小型数据集方面表现出色,但它可能难以处理超过其所运行机器可用内存的大型数据集。这正是QuestDB的优势所在,它专门为此类场景中的高性能操作而设计,使其成为高要求数据分析任务的首选解决方案。

通过将Pandas DataFrames加载到QuestDB中,可以利用数据库强大的数据处理功能,使用户能够将分析和数据操作扩展到大型数据集。以下将学习如何将大型Pandas数据帧加载到QuestDB中,并使用纽约市出租车和豪华轿车委员会发布的黄色和绿色出租车行程记录作为数据来源。

先决条件

对于本文中的教程,建议用户对Python和SQL有基本的了解。此外,还需要在其机器上安装以下软件:

  • Docker

获取数据

在开始将数据加载到QuestDB之前,需要获取将要使用的数据。如上所述,将使用纽约市出租车和豪华轿车委员会的黄色和绿色出租车行程记录,并下载数据:

  • 首先创建一个名为pandas-to-questdb的新目录,并在其中创建一个data目录。
  • 在终端中编辑并执行以下命令下载Parquet文件:
Shell 
 curl -L -o ./data/yellow_tripdata_2022-<MONTH>.parquet https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tr

需要确保将<MONTH>替换成为要下载的月份的零前缀数字(在01和11之间,在撰写本文时第12个月是不可用的)。

有了要获取的数据,那么现在是尝试使用Pandas加载它的时候了。

将记录加载到内存中

人们可能已经注意到下载的文件是Parquet格式的,Parquet是一种用于大数据处理的柱状存储格式。与CSV和JSON等传统的基于行的存储格式相比,它们经过优化,可与现代大数据处理引擎一起使用,并提供高效的数据存储和检索。

在能够加载任何数据之前,将设置一个模拟生产环境,在那里可以轻松地测试如果Pandas不能将Parquet文件加载到内存中会发生什么情况。在生产过程中,用户经常遇到必须处理内存约束的情况,这个环境可以反映这一点。

运行以下命令创建一个新的Docker容器,其内存限制为1GB。如果容器达到了这个限制,Docker会终止它,或者操作系统会内存溢出(OOM)终止正在运行的进程:

Shell 
 docker run -it -m 1g -v "$(pwd)":/tutorial -w /tutorial --net host python:3.11.1-slim-bullseye /bin/bash

现在,有了一个基于Ubuntu的Python 3.11 Docker容器。用户可以根据自己的需求安装,创建一个包含以下内容的requirements.txt文件:

Plain Text 
 pandas>=1.5.3
 psycopg[binary]>=3.1.8
 pyarrow>=11.0.0
 questdb>=1.1.0

现在,在容器内执行pip install -r requirements.txt。Pip将安装Python需求。

至此,有了一个可以加载数据的测试环境。创建一个名为data_loader.py的新文件,其中包含以下内容:

Python 
 # data_loader.py
 import pandas as pd

 df = pd.read_parquet("./data/yellow_tripdata_2022-01.parquet")
 print(df.head())

现在,在Docker容器中运行python data_loader.py来执行它。程序成功运行,可以看到以下内容:

在这里载入了2022年1月的出租车行程记录可以尝试加载更多的数据。将data_loader.py的内容替换为以下代码,从data目录加载所有文件,并再次执行该程序:

Python 
 # data_loader.py

 import os
 import glob
 import pandas as pd
 
 records = glob.glob(os.path.join("data", "*.parquet"))
 
 df = pd.concat((pd.read_parquet(r) for r in records), ignore_index=True)

 print(df.head())

在执行data_loader.py时,应该得到一条错误消息“已经终止”。正如人们可能认为的那样,内存溢出(OOM)杀手终止了该过程。并且无法加载数据集,因此不能这样做,而是需要一种不同的方法。

将数据摄取到QuestDB

在一个新的终端窗口中,通过执行以下操作启动QuestDB容器:

Shell 
 docker run --rm -it -p 8812:8812 -p 9009:9009 --net host --name questdb questdb/questdb

数据库现在可以接收数据了。更新data_loader.py以使用QuestDB包将数据摄取到QuestDB中,该包使用TCP上的InfluxDB Line Protocol (ILP)以获得最大吞吐量。

为了处理大型数据集,将逐个读取文件并将其内容传输到QuestDB。然后,将使用QuestDB来查询数据,并将结果加载回Pandas DataFrames中。基于以上重构数据加载器:

Python 
# data_loader.py

 import os
 import glob
 import pandas as pd
 from questdb.ingress import Sender

 def main():
 files = glob.glob(os.path.join("data", "*.parquet"))

 with Sender("127.0.0.1", 9009) as sender:
 for file in files:
 df = pd.read_parquet(file)
 print(f"ingesting {len(df.index)} rows from {file}")
 sender.dataframe(df, table_name="trips", at="tpep_pickup_datetime")

 if __name__ == "__main__":
 main()

让我们从头开始。注意到的第一个主要变化是,需要在脚本中指定主机名和端口号才能运行它。

然后遍历Parquet文件,并使用Pandas将它们加载到内存中。之后,利用QuestDB的Python客户端,将直接从Pandas DataFrames摄取到QuestDB。

在Python容器中,运行Python data_loader.py。脚本每次摄取一个Parquet文件。

使用行程数据

到目前为止,已经准备好了数据集并将其加载到QuestDB中。现在是执行一些查询并将结果加载到DataFrames中的时候了。使用整个数据集,希望知道按乘客分组的乘客的平均总支付金额是多少。

创建一个名为query_amount.py的新文件,包含以下内容:

Python 
 # query_amount.py

 import pandas as pd
 import psycopg

 QUERY = """
 SELECT passenger_count, avg(total_amount)
 FROM 'trips'
 WHERE passenger_count > 0
 GROUP BY passenger_count
 """

 if __name__ == "__main__":
 conn = psycopg.connect(
 dbname="questdb",
 host="127.0.0.1",
 user="admin",
  password="quest",
 port=8812,
 )

df = pd.read_sql_query(QUERY, conn)

 print(df.head(10))

与数据加载器脚本类似,该脚本需要主机和端口。在上面的脚本中,使用了PostgreSQL Python客户端并使用它连接到QuestDB。在Python容器中,执行Python query_amount.py:

在完成脚本之后,应该看到乘客支付的平均总金额。有趣的是,6名乘客和7名乘客的平均金额相差很大,7名乘客的平均金额几乎是6名乘客的2.5倍。

通过进一步分析数据,可能会发现这一根本原因,这可能与人类的本性有关:这是因为对于路程更长的旅行,人们通常会分担乘车费用。

结语

在本文中,学习了如何使用Pandas DataFrames将大型数据集加载到QuestDB中。通过将数据从Pandas传输到QuestDB,利用了数据库强大的数据处理能力,使用户能够扩展分析和数据操作,以处理大型数据集。

本文的教程中概述的方法只是使用Pandas和QuestDB处理大数据的一种方法。用户可以自定义这一方法以满足其特定需求,并继续探索这些强大工具的可能性。最终目标是使数据分析和操作更容易和更有效,而不管数据集的大小。

原文标题:Loading Pandas DataFrames Into QuestDB作者:Gabor Boros

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/301551.html<

(0)
管理的头像管理
上一篇2025-05-24 09:30
下一篇 2025-05-24 09:31

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注