如何将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

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

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