昨天在群里聊到多款OLAP数据库的多款性能对比,想到之前网上找到的数据一个benchmark, TPCH_Python_SQL_Engines.ipynb(出处已不可考),比拼 并且为了4月26日的更胜演讲,特意在4月24日跑了一遍,多款这个是数据2024年4月24日的对比结果。
图片
图片
从上面的比拼截图可以看到, 这里参加评比的更胜有:
• HyPer:HyPer 是一种高性能、混合事务和分析处理(HTAP)数据库,多款专为实时数据分析和事务处理而设计。数据
• DuckDB:DuckDB 是比拼一款轻量级的嵌入式分析数据库,专注于高效处理SQL查询和分析任务。更胜
• GlareDB:GlareDB 是多款一种新型数据库,专注于高性能和扩展性,数据以满足现代数据密集型应用的比拼需求。
• Databend(国产):Databend 是一款国产云原生数据仓库,支持弹性扩展和高效的数据分析。
• DataFusion:DataFusion 是 Apache Arrow 的一个子项目,云服务器提供商用于构建高性能的数据处理引擎和分布式 SQL 查询执行。
• CHDB:CHDB 是 ClickHouse 的嵌入式版本,适用于需要在进程内高效处理列存储数据的场景。
• Apache Spark:Apache Spark 是一个开源的分布式计算系统,支持大规模数据处理和并行计算。
本次还将加入
• Polars:Polars 是一个基于 Rust 的高性能 DataFrame 库,专为高效的数据处理和分析而设计。
本次测试结果
当时的chdb虽然垫底,但至少还可以跑通
昨天又使用最新版本作了对比, 这次chdb卡在了Query08和Query09上, 为了确认Query09很耗时,我在我的笔记本(mac M2Max 32GB内存)上做了测试,耗时158s多。
图片
• chdb的结果是query08、query09 卡死,放弃后继续后面的查询。08 和09 的结果比这里看到的数据还要糟糕
• 因为Polars对SQL的免费信息发布网支持有限, Polars 根据官方的TPCH[1]做的修改, 另外Query 17的结果是错误的,问题放在后面描述。
• 对比4月份,性能都下降了,难道是Google Colab缩水了?
图片
图片
去掉垫底的chdb和pyspark
为了方便比较,去掉了两个垫底的:chdb和pyspark
图片
图片
Polars的奇怪bug
复制import pandas as pd import duckdb import polars as pl duckdb.sql("select x, y::decimal(15,2) y from df").to_parquet(decimal.pq) decimal = pl.scan_parquet(decimal.pq)1.2.3.4.5.6.• 结果错误
复制pl.sql(""" select x, avg(y) as avg_y from decimal group by 1 """).collect()1.2.3.4.5.6.
图片
• 这样OK
复制# 结果正确 pl.sql(""" select x, sum(y) as sum_y from decimal group by 1 """).collect()1.2.3.4.5.6.7.
图片
• 这样也可以
复制pl.sql(""" select x, sum(y)/count(*) as avg_y from decimal group by 1 """).collect()1.2.3.4.5.6.查找手册的时候发现。
图片
好吧, 该类型仍不稳定。
优雅的代码
你觉得这样写优雅。
复制import pandas as pd duck_import = pd.read_csv(./result/duckdb.csv) hyper = pd.read_csv(./result/hyper.csv) databend = pd.read_csv(./result/databend.csv) datafusion = pd.read_csv(./result/datafusion.csv) glaredb = pd.read_csv(./result/glaredb.csv) chdb = pd.read_csv(./result/chdb.csv) apachespark = pd.read_csv(./result/apachespark.csv) polars = pd.read_csv(./result/polars.csv) concat = duckdb.sql(select duck_import.query as query, duck_import.dur as DuckDB , hyper.dur as hyper , databend.dur as databend , datafusion.dur as datafusion, glaredb.dur as glaredb,chdb.dur as chdb, apachespark.dur as apachespark,ploars.dur as polars from duck_import left join hyper on duck_import.query=hyper.query left join databend on duck_import.query=databend.query left join datafusion on duck_import.query=datafusion.query left join glaredb on duck_import.query=glaredb.query left join chdb on duck_import.query=chdb.query left join apachespark on duck_import.query=apachespark.query left join polars on duck_import.query=polars.query ).df() concat1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.还是这样写优雅。
复制import duckdb concat = duckdb.sql(""" WITH aa AS ( SELECT * FROM read_csv(result/*.csv, filename=true) ), bb AS ( SELECT * EXCLUDE (filename), REPLACE(REPLACE(filename, .csv, ), result/, ) AS engine FROM aa ) PIVOT bb ON engine USING max(dur) ORDER BY query; """).df() concat1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.以上两段代码结果一样。
图片
结论
从上面的粗浅测试来看, 开源的DuckDB和Databend非常值得关注, Polars对SQL支持有限,对Decimal支持有限,入坑请慎重。
Google Colab 到底是企商汇不是缩水了?如何验证?




