昨天在群里聊到多款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')
• 结果错误
pl.sql("""
select x,
avg(y) as avg_y
from decimal
group by 1
""").collect()
图片
• 这样OK
# 结果正确
pl.sql("""
select x,
sum(y) as sum_y
from decimal
group by 1
""").collect()
图片
• 这样也可以
pl.sql("""
select x,
sum(y)/count(*) as avg_y
from decimal
group by 1
""").collect()
查找手册的时候发现。
图片
好吧, 该类型仍不稳定。
优雅的代码
你觉得这样写优雅。
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()
concat
还是这样写优雅。
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()
concat
以上两段代码结果一样。
图片
结论
从上面的粗浅测试来看, 开源的DuckDB和Databend非常值得关注, Polars对SQL支持有限,对Decimal支持有限,入坑请慎重。
Google Colab 到底是不是缩水了?如何验证?