多款OLAP数据库大比拼,谁更胜一筹?

数据库 其他数据库
昨天又使用最新版本作了对比, 这次chdb卡在了Query08和Query09上, 为了确认Query09很耗时,我在我的笔记本(mac M2Max 32GB内存)上做了测试,耗时158s多。

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

责任编辑:武晓燕 来源: alitrack
相关推荐

2024-07-31 09:39:33

2017-06-08 15:38:41

2010-05-28 11:21:17

2020-03-06 09:21:28

PWA原生应用Web

2014-03-06 15:07:41

青橙小米

2018-06-12 10:09:41

编程语言PythonJava

2022-07-20 08:16:54

Lombokjava工具

2020-02-02 15:42:22

PythonC++编程语言

2020-01-18 14:55:03

架构运维技术

2017-01-11 14:38:39

编程语言Java

2023-08-09 18:08:35

ChatGPTStackOverflow

2017-11-13 15:38:03

VMwareOpenStack混合云

2015-12-08 13:48:50

大数据工具R语言Spark

2018-10-12 13:54:26

2019-01-04 09:59:14

KafkaRabbitMQMQ

2010-07-27 14:36:31

Flex Array

2013-02-19 13:13:33

SurfaceiPad

2010-05-21 16:36:09

GoogleCode

2023-04-26 07:34:38

Java并发编程

2023-08-23 15:14:13

Web开发Javascript编程语言
点赞
收藏

51CTO技术栈公众号