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

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

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