基于我对 Superset[1] 和 duckdb_engine[2] 贡献的代码,在 rwhaling[3],zhaoyongjie[4] 和 villebro[5] 的共同努力下,DuckDB 正式成为官方支持的数据库。
Why DuckDB
嵌入式,像使用 SQLite 一样方便
跨平台
可以把它当作redshift的单机版
进程内 OLAP 数据库引擎,更快
支持直接访问 csv 和 parquet 格式,可以方便地把 csv 和 parquet 注册为虚拟表(virtual datasets)
DuckDB 支持几乎所有 PostgreSQL 的语法, 并且大小写无关,这个对于数据分析来说非常有用
DuckDB 是多线程的,因此您可以利用所有 CPU 内核而无需额外设置工作 - 无需对数据或任何东西进行分区!
更多关于 DuckDB 的介绍和优点,可以看我的公众号相关文章。
安装
安装 duckdb_engine , pip install duckdb-engineDuckDB 选项出现在数据库下拉框里 设置数据库连接, duckdb:////Users/whoever/path/to/duck.db
或者duckdb:///:memory:
(内存数据库)在 SQL Lab 里, 可以像使用其它数据库一样使用它了 在 SQL Lab 里, 可以直接查询磁盘上的 parquet 或者 CSV: SELECT * from 'test.parquet'
。


目前支持 DuckDB 的 Superset 还没有新的版本 release,如果想体验的,需要安装 master 版本。
DuckDB 直接读取 CSV 与 Parquet
Parquet
SELECT count(*) from '/Users/steven/data/yellow_taxi/*/*.parquet'

返回 1173057927,用时 1.01s(11 亿数据秒出有没有?),还支持通配符(下图为我把 NYC Yellow Taxi 的数据按年拆分)

CSV
SELECT count(*) from '/Users/steven/data/sales_5m.csv.gz'

csv.gz, 500 万,这个要比 Parquet 慢多了。
DuckDB 与 Jinja 模板,解锁更多功能
之前的文章已经介绍过 Superset 支持 Jinja 模板, 今天顺便介绍下 DuckDB 与 Jinja 模板相结合的例子。
因为 DuckDB 可以和 Pandas DataFrame、CSV、Parquet 无缝衔接,我们可以充分利用这个特点来定义一些宏,读取(处理)一些 Superset 不支持的格式。
今天就介绍一个读取 Excel 的例子,
定义宏
# activate Jinja templatingFEATURE_FLAGS = { # . . . . . "ENABLE_TEMPLATE_PROCESSING": True}import pandas as pdimport tempfiledef read_excel(file_path, sheet_name=0,header=0): """ 可以参照pandas的read_excel方法来丰富参数 把Excel转为Parquet格式,方便DuckDB访问 """ df = pd.read_excel(file_path,sheet_name=sheet_name,header=header) fp = tempfile.NamedTemporaryFile(delete=False) df.to_parquet(f"{fp.name}.parquet",index=False) return f"{fp.name}.parquet"# 定义自己的宏JINJA_CONTEXT_ADDONS = { 'read_excel': read_excel,}
使用宏,
SELECT * from '{{read_excel("/Users/steven/data/titanic.xlsx")}}';

可以根据需要完善 read_excel
函数。同样的我们还可以用于机器学习之中。
DuckDB 有没有给你带来惊艳的感觉?
参考资料
Superset: https://github.com/apache/superset
[2]duckdb_engine: https://github.com/Mause/duckdb_engine
[3]rwhaling: https://github.com/rwhaling
[4]zhaoyongjie: https://github.com/zhaoyongjie
[5]villebro: https://github.com/villebro
欢迎关注公众号

有兴趣加群讨论数据挖掘和分析的朋友可以加我微信(witwall),暗号:入群

也欢迎投稿!




