阿里云EMR Serverless Spark Notebook集成了DuckDB,并增强了其与云上数据源的集成能力。用户除了可以免密访问OSS/OSS-HDFS并高效操作多种格式的数据文件外,还可以直接通过SQL查询DLF(数据湖构建)中定义的元数据表,实现对数据湖的一站式、轻量化探索与分析。
背景信息
DuckDB 是一款轻量级、高性能的嵌入式分析型数据库引擎,专为 OLAP(联机分析处理)场景优化。
功能特性
嵌入式架构:无需独立服务器,以库的形式直接嵌入应用程序(类似SQLite),支持内存/磁盘模式。
列式存储:数据按列存储,优化聚合查询与扫描性能。
向量化执行:利用SIMD指令并行处理数据批次,减少CPU开销。
标准兼容:支持SQL-92、SQL:2011标准,涵盖CTE、窗口函数、JOIN(包括ASOF JOIN)、子查询等。
多格式直读:直接查询CSV、Parquet、JSON文件,无需导入。
零拷贝集成:与Pandas、Arrow等内存数据结构无缝转换,避免数据迁移开销。
联邦查询:通过
httpfs扩展访问远程文件(如S3),或连接PostgreSQL等外部数据库联合查询。
适用场景
交互式分析:快速处理GB~TB级数据集,替代Pandas/Excel处理大数据。
边缘计算:嵌入式部署在终端设备,执行本地数据分析。
数据科学:与Python/R生态无缝衔接,作为ML数据预处理引擎。
实时OLAP:支持高频更新与复杂查询并存的分析需求。
使用限制
版本要求:
esr-4.x:esr-4.7.0及之后版本。
esr-3.x:esr-3.6.0及之后版本。
通过 DuckDB 读取 Paimon 表时,存在以下限制:
操作类型:仅支持读取 Paimon Append 表,暂不支持读取主键表和写入操作。
表格式要求:仅支持
file.format = 'parquet'的 Paimon 表。
使用方法
在EMR Serverless Spark页面,单击左侧的数据开发。
新建Notebook。
在开发目录页签下,单击
图标。在弹出的对话框中,输入名称,类型使用,然后单击确定。
在右上角选择已创建并启动的Notebook会话实例。
您也可以在下拉列表中选择创建Notebook会话,新建一个Notebook会话实例。关于Notebook会话更多介绍,请参见管理Notebook会话。
说明由于 DuckDB 是单机 SQL 引擎,仅会使用 Notebook Spark driver 的资源,因此建议增大 Spark driver 的
spark.driver.cores和spark.driver.memory资源配置。在 Notebook 的 Python 代码中,可以直接通过
import duckdb进行使用。以下列举了几种常用的 DuckDB 使用方法。读取文件
查看 parquet、csv、json 文件的内容。
import duckdb # 查看 parquet 文件的内容 duckdb.sql("SELECT * FROM 'oss://bucket/path/to/test.parquet'") # 查看 csv 文件的内容 duckdb.sql("SELECT * FROM 'oss://bucket/path/to/test.csv'") # 查看 json文件的内容 duckdb.sql("SELECT * FROM 'oss://bucket/path/to/test.json'")
查看 parquet 文件的 schema 信息。
import duckdb # 查看 parquet 文件的 schema 信息 duckdb.sql("SELECT * FROM parquet_schema('oss://bucket/path/to/test.parquet')")
将 parquet 文件的内容导出为 csv 文件。
import duckdb # 将 parquet 文件的内容导出为 csv 文件 duckdb.sql("COPY (SELECT * FROM 'oss://bucket/path/to/test.parquet') TO 'oss://bucket/path/to/output.csv' (HEADER, DELIMITER ',');")
说明在进行OSS文件的读写操作之前,请确保已开通OSS服务,并创建相应的存储空间,同时确认具备对该存储空间的访问权限。
访问DLF Catalog
说明不支持数据共享创建的DLF Catalog。
查看当前空间已挂载的 DLF Catalog。有关更多 DLF 数据目录的内容,请参见管理数据目录。
import duckdb duckdb.sql("show databases")
查询 DLF Catalog 中的表数据。
import duckdb duckdb.sql("use <catalogName>.<databaseName>") duckdb.sql("select * from <tableName> limit 10")
了解更加详细的功能使用,请参考 DuckDB 的官方文档。