暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

多款OLAP数据库大比拼

alitrack 2024-07-19
207

对代码感兴趣的,可以关注公众号,并私信tpch。

昨天在群里聊到多款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 到底是不是缩水了?如何验证?

对代码感兴趣的,可以关注公众号,并私信tpch。

引用链接

[1]
 官方的TPCH: https://github.com/pola-rs/tpch


文章转载自alitrack,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论