category
大数据的现状
在过去的十年里,大数据格局发生了显著的转变。在这个快速发展的领域,今天可用的工具数量惊人——大约是十年前的九倍。
这种多样性不仅限于数据仓库、数据湖和湖屋。它已扩展到处理方法,从ETL(提取、转换、加载)过渡到ELT(提取、加载、转换)、EL(提取、装载)等。选项的激增既是福也是祸,因为它使成为任何一项技术的专家的任务变得复杂——毕竟,时间对我们所有人来说都是一样的!
SQL已经成为这个庞大而多样的生态系统中数据转换的首选工具,事实上它是许多数据处理平台的首选语言。
在众多的工具中,有一个新来者正在掀起巨大的波澜——你已经猜到了…DuckDB!
DuckDB为啥呱呱叫,你为什么要在乎!?
DuckDB是一个进程内SQL分析引擎,它正在迅速流行起来,其令人印象深刻的统计数据证明了这一点:
- PyPI每月下载170万次
- GitHub上有13800颗星,在一半的时间内达到了与Postgres相同的兴趣
DuckDB vs. Postgres — GitHub Star Rating
- 根据DB引擎趋势的报告,在可比的两年时间内,DuckDB的受欢迎程度与Snowflake相同;它似乎很有可能在未来几年成为主流,并取代目前在传统数据仓库中处理的至少一些有效载荷。
DuckDB vs. Snowflake — DB Engines ranking
DuckDB的开源性质,由其麻省理工学院的永久许可证保证,增加了它的吸引力。
DuckDB的主要优势
- 易于安装:运行DuckDB就像brew-install-DuckDB(安装DuckDB CLI)一样简单
- 低复杂性:没有服务器(DuckDB只是一个二进制文件)意味着不需要处理凭据、访问控制列表、防火墙配置等。
通用兼容性:DuckDB几乎没有依赖项,它体现了可移植性——它甚至可以在浏览器中运行!
- DataFrame集成:DuckDB的Python库能够查询Pandas DataFrames——这改变了游戏规则!它充当了它与任何无法直接查询的系统之间的统一层或“粘合剂”,方便了数据处理中的转换步骤。
扩展:DuckDB有一个灵活的扩展机制,允许更大的灵活性,尤其是当直接从JSON和Parquet或直接从S3读取数据时。此功能极大地提高了开发人员的体验。
- 稳定性和效率:DuckDB旨在处理超出内存限制的工作负载(尽管有一些限制)。这在分析的数据集明显大于可用RAM但小到可以放在磁盘上的情况下尤其重要——这使得分析能够使用“廉价”且现成的硬件(如笔记本电脑)完成。
实时数据管道中的DuckDB
与基于云的系统相比,DuckDB以其最低的要求和成本效益而脱颖而出。它消除了对云帐户、配额或额外费用的需求。从开发人员的笔记本电脑到生产设置,DuckDB在各种环境中的一致性与基于云的解决方案形成了鲜明对比,这些解决方案往往会随着时间的推移和数据的陈旧或无效而发生漂移。
在任何地方运行DuckDB的简单性绕过了分布式系统中常见的挑战,例如将数据移动到计算节点、VM/作业协调和故障处理。现代机器的容量,无论是基于云的还是类似于苹果M1 SoC的机器,通过为非常大的数据集提供单机处理场景,进一步增强了DuckDB的实用性。事实是,很少有客户需要每天处理TB的数据,真正需要的CPU功率比所有公共云中的可用CPU功率都要大。
SQL语法糖
DuckDB的相对新颖性使其能够灵活地引入新的SQL语法增强,如GROUP BY ALL、SELECT*EXCLUDE、ASOF JOINS等。这些添加使SQL查询更加直观和可读;请考虑以下片段:
-- Group by several fields in ANSI SQL
SELECT country, city, region, postal_code, AVG(price) AS avg_price
FROM customers
-- Non-aggregated fields need to be repeated here
GROUP BY country, city, region, postal_code;
-- Group by all in DuckDB
SELECT country, city, region, postal_code, AVG(price) AS avg_price
-- Fields are only listed once; maintaining the code becomes easier
GROUP BY ALL;
-- Query all but the 'email' field in ANSI SQL
SELECT country, city, region, postal_code, address, phone_number
/*, email*/
FROM customers;
-- Query all but the 'email' field in DuckDB
SELECT * EXCLUDE (email) FROM customers;
-- Consider joining timestamps that are 'approximately' equal.
-- In ANSI SQL, you would generally have to bucket them
-- In DuckDB, you can use an ASOF JOIN to achieve the same results,
-- more simply and efficiently.
SELECT events.id, events.ts, events.val, metadata.details
FROM events
ASOF JOIN metadata USING(id, ts);
与Pandas数据框架集成
DuckDB的一个显著优势,尤其是在Python生态系统中,是它与Pandas数据帧的无缝集成。此功能简化了合并来自不同来源的不同数据集的过程,简化了数据分析和转换任务。
例如,在Jupyter笔记本中,可以执行以下操作(基于电影推荐系统数据集):
# Install dependencies
%pip install --quiet duckdb
%pip install --quiet jupysql
%pip install --quiet duckdb-engine
%pip install --quiet pandas
%pip install --quiet matplotlib
%pip install --quiet psycopg2-binary
%pip install --quiet dash
%pip install --quiet plotly
import duckdb
import pandas as pd
# Load and configure jupysql
%load_ext sql
%config SqlMagic.autopandas = True
%config SqlMagic.feedback = False
%config SqlMagic.displaycon = False
%config SqlMagic.named_parameters=True
# Connect to a local DuckDB instance
%sql duckdb:///
# Enable DuckDB to query remote files (i.e., S3)
%%sql
INSTALL httpfs;
LOAD httpfs;
# Configure S3 access keys
SET s3_region = '...';
SET s3_access_key_id = '...';
SET s3_secret_access_key = '...';
# Connect to a remote Postgres database
ATTACH 'dbname=DATABASE user=USER host=HOST password=PASSWORD
connect_timeout=10' AS postgres (TYPE postgres, READ_ONLY);
# Execute a query and store it in a dataframe
%%sql
df << SELECT
t1.movieId,
t1.title,
t1.genres,
t2.userId,
t2.rating,
t3.tag
# query a table in Postgres
FROM postgres.public.movies AS t1
# join with a table from DuckDB
INNER JOIN ratings AS t2 USING (movieId)
# join with a JSON dataset from S3
INNER JOIN 's3://S3-BUCKET/tags.json' AS t3 USING (userId, movieId)
# And finally, reference the dataframe from another query
%%sql
by_genres << SELECT genres, COUNT(*) AS cnt
FROM df
GROUP BY ALL
ORDER BY 2 DESC
LIMIT 5;
# Or plot the transformed dataset
import plotly.express as px
fig = px.pie(by_genres,
values='cnt',
names='genres',
title='Top 5 movie genres')
fig.show()
结论
这篇关于DuckDB的综述突出了它在大数据领域作为一种通用、高效和用户友好的工具的潜力。作为一个相对较新的进入者,它在弥合差距和实现符合数据工程师和软件开发人员不断发展的需求的解决方案方面处于独特的地位。
我对它在处理最常见的数据处理用例时的实用性和多功能性充满信心。我期待着听到你在DuckDB的经历和见解!
直到下次——继续查询!
- 登录 发表评论
- 444 次浏览
最新内容
- 2 hours ago
- 4 hours 42 minutes ago
- 4 hours 57 minutes ago
- 2 days 20 hours ago
- 3 days 3 hours ago
- 3 days 4 hours ago
- 3 days 4 hours ago
- 3 days 4 hours ago
- 1 week ago
- 1 week ago