如何将Pandas数据帧加载到QuestDB

译文
数据库
本文将介绍如何通过使用QuestDB Python包获取Pandas DataFrames来提高时间序列分析能力。

译者 | 李睿

审校 | 重楼

简介

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

责任编辑:华轩 来源: 51CTO
相关推荐

2021-08-12 08:00:00

Pandas数据分析SQL

2020-02-28 09:26:54

PythonGo语言C语言

2021-04-19 12:31:04

太坊数据QuestDB

2011-06-13 15:09:36

插件 Qt Designer

2023-02-17 12:07:45

ChatGPTPython

2018-10-09 14:16:21

Hadoop数据移入数据传输

2022-10-10 11:00:29

数据分析云战略

2017-11-21 08:36:00

MongoDB关系型数据库数据导入

2009-08-26 18:05:25

ViewState持久

2012-06-20 11:17:02

MemSQL

2018-10-22 14:48:39

KafkaHadoop代码

2021-01-28 09:00:00

SQL数据库NoSQL

2011-11-08 15:15:40

路由器复位

2012-11-07 15:57:34

OSSECMYSQL

2015-10-28 14:59:26

JAVA插件Chrome

2009-06-11 10:50:27

netbeans配置

2016-09-06 10:58:31

大数据信息

2011-04-11 15:55:03

商业智能数据

2018-06-12 15:07:57

IT

2011-05-18 14:51:43

点赞
收藏

51CTO技术栈公众号