仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接
Python长期以来一直主导着数据分析。相关数据显示,Python是数据分析的首选,近90%的专业人士经常使用它,超过70%的人更喜欢它。
Pandas成为了默认工具,每个人都在用,而且它运行良好。但它的规模一旦扩大,就会出现问题。内存紧张,性能也会下降。
现在有一个强有力的替代方案。
DuckDB+PyArrow提供了一种全新的模型。它们共同将传统的DataFrame替换为更快、更强大、更灵活的模型。该堆栈专为扩展而构建,支持列操作,支持SQL,并且无需转换即可跨格式运行。
Pandas非常适合快速分析。但本质上,它并未针对规模进行优化。它逐行存储数据。这对于小数据来说还行,但对于更大的数据,这会导致内存膨胀和CPU浪费。
你不能分块传输数据。你需要加载所有内容,并将其保存在内存中,这限制了你的操作能力。
像Parquet这样的多文件格式很笨拙。你需要把所有内容都转换成DataFrame。每个操作都会复制内存。没有下推过滤,没有分区,没有矢量化扫描。只有Python中的逐行循环。
现在文件越来越大,数据集也存储在云存储中。工具也需要改进。
ApacheArrow是一种列式内存格式。它以块的形式保存数据。每列在内存中都是连续的。这使得过滤、排序和向量操作的速度更快。
它与语言无关。你可以在Python、Rust、Go和C++之间共享Arrow表,而无需复制。
许多工具已经在内部使用Arrow。Spark、Snowflake和Polars就是例子。但Arrow不是数据库或引擎。它只是一种格式。你仍然需要某种东西来查询它。
这就是DuckDB发挥作用的地方。
DuckDB是一个进程内OLAP引擎。它类似于SQLite,但专为分析而设计。它支持SQL,速度很快,并且无需服务器即可运行。
DuckDB将数据存储在列中,而不是行中。它直接从Parquet和Arrow读取数据。它可以执行连接、过滤和聚合,而无需将所有数据加载到RAM中。
它也在Python内部运行。
这意味着你可以将DuckDB用作DataFrames或Arrow表上的快速SQL层。你无需移动数据,只需在数据所在位置进行查询即可。
PyArrow提供现代的表格格式。DuckDB提供现代的SQL引擎。它们共同取代了传统的DataFrame。
以下是一个例子:
无需Pandas,无需转换。只需创建一个Arrow表,并在其上运行SQL,即可获得DuckDB视图或PandasDataFrame形式的结果。
这很高效,避免了复制,并且还能让你扩展。
DuckDB以矢量化批次扫描数据。它会下推过滤器,并使用并行线程。在执行连接、过滤和聚合操作时,它通常比Pandas更快,尤其是在数据量较大或来自磁盘的情况下。
Arrow表非常紧凑。它们使用原生类型,无需Python对象。DuckDB可以就地查询它们。这样可以避免Pandas转换和中间数组带来的内存峰值。
使用DuckDB,你可以使用SQL。这样可以避免Pandas中复杂的链式调用. groupby().apply().merge()。SQL更清晰,更易于测试,更易于调试。它还支持窗口函数等高级操作。
DuckDB可以直接读取Parquet、CSV、Arrow甚至JSON。你可以跳过转换步骤,直接对原始文件进行查询。
该命令无需将文件读入Pandas即可运行,只需在磁盘上操作,并流式传输列。最重要的是,它可扩展。
DuckDB不仅适用于笔记本。它还适用于FastAPI路由、Airflow任务、CLI脚本和可测试的数据管道。
这是一个简单的API模式:
这为你提供了一个实时分析端点。无需ETL,无需数据仓库,只需DuckDB和文件。
特征工程通常需要连接、过滤和滞后函数。Pandas可以做到,但速度很慢,而且很繁琐。
DuckDB可以清晰地处理这个问题:
这展示了如何在不脱离Python的情况下将SQL窗口应用于Pandas输入。它节省时间并保持低内存占用。
使用DuckDB扩展,你甚至可以查询S3和HTTP源。
你无需下载文件。DuckDB会流式传输数据,只读取所需内容。对于数据科学家和工程师来说,这改变了笔记本电脑的运作方式。
注意:INSTALLhttpfs是DuckDBSQL命令,它增加了通过HTTP、HTTPS、AmazonS3和其他云存储协议读取远程文件的支持。
DuckDB和PyArrow为Python用户提供了一条新途径。它突破了Pandas的内存限制,将SQL的强大功能引入本地工作流。它还能将Arrow、Parquet、CSV等现代数据格式作为原生输入。
长按👇关注-数据STUDIO-设为星标,干货速递