在Notebook中使用DuckDB

更新时间:
复制为 MD 格式

阿里云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 表。

使用方法

  1. EMR Serverless Spark页面,单击左侧的数据开发

  2. 新建Notebook。

    1. 开发目录页签下,单击image图标。

    2. 在弹出的对话框中,输入名称,类型使用交互式开发 > Notebook,然后单击确定

  3. 在右上角选择已创建并启动的Notebook会话实例。

    您也可以在下拉列表中选择创建Notebook会话,新建一个Notebook会话实例。关于Notebook会话更多介绍,请参见管理Notebook会话

    说明

    由于 DuckDB 是单机 SQL 引擎,仅会使用 Notebook Spark driver 的资源,因此建议增大 Spark driver 的 spark.driver.coresspark.driver.memory 资源配置。

  4. 在 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'")

      image

    • 查看 parquet 文件的 schema 信息。

      import duckdb
      
      # 查看 parquet 文件的 schema 信息
      duckdb.sql("SELECT * FROM parquet_schema('oss://bucket/path/to/test.parquet')")

      image

    • 将 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")

      image

    • 查询 DLF Catalog 中的表数据。

      import duckdb
      duckdb.sql("use <catalogName>.<databaseName>")
      duckdb.sql("select * from <tableName> limit 10")

      image

了解更加详细的功能使用,请参考 DuckDB 的官方文档