Databend 11 月月报:多模态查询智能

Hi,Databend 的朋友们!🚀

11 月,我们发布了 17 个 nightly 版本,致力于打造更丰富的数据体验。本月上线了 TimestampTz 支持、HTTP Arrow payloads、支持 RBAC 的脱敏策略,并进行了三轮 Runtime Filter 调优,同时针对多模态负载改进了全文索引和 VECTOR 支持。现在的查询接口支持从 JSON、Arrow IPC 到几何数据等多种输出格式,助力分析团队更高效地构建多样化应用。

月度数据

从 v1.2.834-nightly 到 v1.2.850-nightly,我们累计合并了 27 个新功能28 个 bug 修复18 项重构6 项 CI/构建改进 以及 27 项体验优化

本月亮点

🔥 核心新功能

  • TimestampTz 与 ANSI 日期关键字 --- 新增 TimestampTzCURRENT_DATECURRENT_TIMEDATE ± INTERVAL 语义,确保跨区域的时间处理流程具有良好的可移植性。
  • Arrow over HTTP 与几何元数据 --- 查询接口支持返回带有时区和几何格式提示的 Arrow IPC 响应,实现低延迟 BI 分析。
  • UDTF Server Runtime --- 用户定义的表函数现在作为托管服务运行,具备传输诊断和 Python 导入缓存功能。
  • 支持 Position 的 SQL --- 标准 POSITION 列现在可以在 SQL 兼容的流程中查询,简化了从传统引擎的迁移。
  • System Streams 遥测 --- system.streams 暴露 has_data 字段,配合更丰富的验证输出,方便调试数据摄入。

🧠 多模态查询与分析

  • 倒排索引 TOP-N 剪枝与缓存 --- 针对 JSON/Variant 文本的 ORDER BY/LIMIT 查询现在会自动跳过无关数据块,并结合了更新后的向量量化评分。
  • Decimal64 与 Arrow 56 升级 --- 原生格式表直接反序列化 Decimal64 列,升级后的 Arrow/Parquet 组件支持一致的 Schema 演进。
  • Bitmap 工具集 --- bitmap_to_array 配合新的 Runtime Filter 机制,解锁更快的集合分析和跨模态 Join。
  • 虚拟列全面支持 --- 外部表、Selection 查询和 LIMIT 流程现在都支持虚拟列计算。

🛡️ 治理与信任

  • 脱敏策略升级 --- 多列 USING 子句、RBAC 强制执行、冲突检测和删除保护,确保隐私规则的一致性。
  • 策略可观测性 --- policy_reference 表函数记录了脱敏/行访问策略的应用位置,便于快速合规审计。
  • 安全默认配置 --- 序列查找、JWT 绑定和 MySQL TLS 握手增加了防护措施,防止权限提升或部分会话问题。

⚙️ 性能与运维

  • Runtime Filter 优化(1-3 部分) --- 自适应过滤器现在支持可空转换、捕获时序并避免冗余转换,在分布式 Join 中节省数秒时间。
  • 同步背压溢出 --- 溢出决策改为同步处理,在有效控制内存使用的同时,避免产生嘈杂的日志。
  • Parquet 字典开关与时区一致性 --- Fuse 表新增 enable_parquet_dictionary;查询时区传播已端到端实现(HTTP 头、会话状态、Clamp 辅助函数)。
  • Meta 服务弹性 --- 针对聚合溢出、opendal 0.54.1 升级和 fetch-add 路径增加了更广泛的日志记录,减少了繁忙集群中的热点问题。

🐛 稳定性与质量

  • 修复了 CSV 摄入、Pivot 投影和聚合溢出的回退问题;
  • COUNT DISTINCT、ZIP 导入和 Bitmap 数组边界情况现在表现确定;
  • 密码策略描述符、Record-Batch 转换和大型 JWKS/MariaDB 会话不再抛出运行时异常。

核心功能:多模态数据分析 (CityDrive 场景)

现在的 Databend 数据库足以支持所有检索模式 ------关系型、JSON、向量、Bitmap、地理空间------无需启动单独的服务。这正是 多模态数据分析指南 的核心价值所在,该指南围绕 CityDrive Intelligence 数据集展开。基于同样的 video_id/frame_id 列,你可以同时使用 SQL 过滤、Elasticsearch 风格的 QUERY()、HNSW 向量搜索和 GEOMETRY Join,让你仅需在一个数据仓库中即可完成所有工作。本期焦点将带你回顾这一场景,一步步展示统一检索在实战中的威力。

0. 自动化数据摄入

CityDrive 将每一批次数据导出为 Parquet。 Lakehouse ETL 指南 设置了一个可复用的 Stage 和任务驱动的 COPY 流程,持续导入每种模态的数据:

sql 复制代码
-- 连接到 CityDrive 的 S3 存储桶
CREATE OR REPLACE CONNECTION citydrive_s3
    STORAGE_TYPE='s3'
    ACCESS_KEY_ID='<AWS_ACCESS_KEY_ID>'
    SECRET_ACCESS_KEY='<AWS_SECRET_ACCESS_KEY>';

-- 指向原始多模态导出的共享 Stage
CREATE OR REPLACE STAGE citydrive_stage
    URL='s3://citydrive-lakehouse/raw/'
    CONNECTION=(CONNECTION_NAME='citydrive_s3')
    FILE_FORMAT=(TYPE='PARQUET');

-- 自动化 ETL:每 10 分钟加载一次视频帧元数据
CREATE OR REPLACE TASK task_load_citydrive_videos
    WAREHOUSE='default'
    SCHEDULE=10 MINUTE
AS
COPY INTO citydrive_videos (
    video_id,
    vehicle_id,
    capture_date,
    route_name,
    weather,
    camera_source,
    duration_sec
) FROM (
    SELECT
        video_id::STRING,
        vehicle_id::STRING,
        capture_date::DATE,
        route_name::STRING,
        weather::STRING,
        camera_source::STRING,
        duration_sec::INT
    FROM @citydrive_stage/videos/
) FILE_FORMAT=(TYPE='PARQUET');

-- 自动化 ETL:同步加载帧数据
CREATE OR REPLACE TASK task_load_frame_events
    WAREHOUSE='default'
    SCHEDULE=10 MINUTE
AS
COPY INTO frame_events (
    frame_id,
    video_id,
    frame_index,
    collected_at,
    event_tag,
    risk_score,
    speed_kmh
) FROM (
    SELECT
        frame_id::STRING,
        video_id::STRING,
        frame_index::INT,
        collected_at::TIMESTAMP,
        event_tag::STRING,
        risk_score::DOUBLE,
        speed_kmh::DOUBLE
    FROM @citydrive_stage/frame-events/
) FILE_FORMAT=(TYPE='PARQUET');

-- 激活任务,数据自动导入
ALTER TASK task_load_citydrive_videos RESUME;
ALTER TASK task_load_frame_events RESUME;

1. 关系型 SQL 分析 (指南: SQL Analytics)

基础表保存了规范的车辆视频帧指标:

sql 复制代码
CREATE OR REPLACE TABLE citydrive_videos (...);
CREATE OR REPLACE TABLE frame_events (...);

WITH recent_videos AS (
    SELECT * FROM citydrive_videos
    WHERE capture_date >= '2025-01-01' AND capture_date < '2025-01-04'
)
SELECT v.video_id, v.route_name, COUNT(f.frame_id) AS flagged_frames
FROM recent_videos v
LEFT JOIN frame_events f USING(video_id)
GROUP BY v.video_id, v.route_name
ORDER BY flagged_frames DESC;

LATERAL FLATTEN 连接 frame_metadata_catalog 进行嵌套检测,而 ROLLUP/CUBE 按路线和天气汇总风险。本月发布的 Runtime Filter 增强功能确保即使在数据规模扩大的情况下,这些 Join 操作依然响应迅速。

2. JSON 与搜索 (指南: JSON & Search)

倒排索引允许进行 Elasticsearch 风格的过滤,而无需复制数据:

sql 复制代码
CREATE OR REPLACE TABLE frame_metadata_catalog (
    doc_id STRING,
    meta_json VARIANT,
    captured_at TIMESTAMP,
    INVERTED INDEX idx_meta_json(meta_json)
);

SELECT doc_id, captured_at
FROM frame_metadata_catalog
WHERE QUERY('meta_json.scene.weather_code:rain AND meta_json.camera.sensor_view:roof')
ORDER BY captured_at;

policy_reference 函数配合脱敏策略控制,意味着你可以对任何镜像这些 JSON 负载的列应用感知 RBAC 的隐私保护,可选的 Arrow-over-HTTP 响应则将过滤后的负载直接流式传输到 BI 工具中。

3. 向量搜索 (指南: Vector Search)

语义搜索与 SQL 并行运行:

sql 复制代码
CREATE OR REPLACE TABLE frame_embeddings (
    frame_id STRING,
    video_id STRING,
    sensor_view STRING,
    embedding VECTOR(512),
    encoder_build STRING,
    created_at TIMESTAMP,
    VECTOR INDEX idx_frame_embeddings(embedding) DISTANCE='cosine'
);

WITH query_embedding AS (
    SELECT embedding FROM frame_embeddings WHERE frame_id='FRAME-0101'
)
SELECT e.frame_id, e.video_id,
       COSINE_DISTANCE(e.embedding, q.embedding) AS distance
FROM frame_embeddings e
CROSS JOIN query_embedding q
ORDER BY distance
LIMIT 3;

4. 地理空间分析 (指南: Geo Analytics)

Geo 表使用相同的 ID,所以"这发生在哪里?"只是另一个 Join:

sql 复制代码
CREATE OR REPLACE TABLE frame_geo_points (
    video_id STRING,
    frame_id STRING,
    position_wgs84 GEOMETRY,
    solution_grade INT,
    source_system STRING,
    created_at TIMESTAMP
);

SELECT f.frame_id, ST_DISTANCE(g.position_wgs84, s.signal_position) AS meters_to_signal
FROM frame_geo_points g
JOIN signal_contact_points s USING(frame_id)
JOIN frame_events f USING(frame_id)
WHERE ST_WITHIN(g.position_wgs84,
      TO_GEOMETRY('SRID=4326;POLYGON((114.05 22.54, 114.13 22.54, 114.13 22.57, 114.05 22.57, 114.05 22.54))'));

最后,用一条 SQL 语句将所有内容串联起来:过滤 JSON 标签、查找向量邻居并检查信号距离:

sql 复制代码
WITH json_hits AS (
    SELECT doc_id
    FROM frame_metadata_catalog
    WHERE QUERY('meta_json.media_meta.tagging.labels:pedestrian')
),
vector_hits AS (
    SELECT frame_id
    FROM frame_embeddings
    WHERE COSINE_DISTANCE(
          embedding,
          (SELECT embedding FROM frame_embeddings WHERE frame_id='FRAME-0102')
    ) < 0.3
)
SELECT f.frame_id, v.route_name, s.distance_m
FROM frame_events f
JOIN citydrive_videos v USING(video_id)
JOIN json_hits j ON j.doc_id = f.frame_id
JOIN vector_hits vh ON vh.frame_id = f.frame_id
JOIN signal_contact_points s USING(frame_id);

这一条查询跨越了结构化事实、JSON 元数据、向量相似度和地理空间距离------全部在 Databend 中执行。这就是统一多模态检索的魅力。

📘 按照顺序(SQL Analytics → JSON & Search → Vector Search → Geo Analytics)跟随指南,在你的集群上重现这个完整的端到端流程。一个数仓,搞定所有分析模式。


Databend 现已演进为一个统一的分析引擎:从经典的 SQL 查询、JSON 检索、向量相似度匹配,到地理空间分析,再到自动化的数据导入与 ETL,所有这些能力都已集成在同一个数据库中。你无需再在各种数据库或服务之间周转,就能直接从类似 CityDrive 的数据集中挖掘出深层价值。

关于 Databend

Databend 是一款 100% Rust 构建、面向对象存储设计的新一代开源云原生数据仓库,统一支持 BI 分析、AI 向量、全文检索及地理空间分析等多模态能力。期待您的关注,一起打造新一代开源 AI + Data Cloud。

👨‍💻‍ Databend Cloud:databend.cn

📖 Databend 文档:docs.databend.cn

💻 Wechat:Databend

✨ GitHub:github.com/databendlab...

相关推荐
疯狂成瘾者6 小时前
后端系统、服务稳定性里核心的指标有哪些
数据库
SPC的存折7 小时前
openEuler 24.03 MariaDB Galera 集群部署指南(cz)
linux·运维·服务器·数据库·mysql
仲芒7 小时前
[24年单独笔记] MySQL 常用的 DML 命令
数据库·笔记·mysql
SPC的存折7 小时前
MySQL 8.0 分库分表
linux·运维·服务器·数据库·mysql
蓦然乍醒7 小时前
使用 DBeaver 还原 PostgreSQL 备份文件 (.bak) 技术文档
数据库·postgresql
XDHCOM7 小时前
Redis节点故障自动恢复机制详解,如何快速抢救故障节点,确保数据不丢失?
java·数据库·redis
QCzblack7 小时前
BugKu BUUCTF ——Reverse
java·前端·数据库
cyber_两只龙宝7 小时前
【Oracle】Oracle之DQL中WHERE限制条件查询
linux·运维·数据库·云原生·oracle
luis的妙妙屋7 小时前
主流数据库数据类型对比分析
数据库
XDHCOM8 小时前
ORA-00054资源忙故障修复,远程处理Oracle报错解决方案,数据库锁超时NOWAIT指定问题排查
数据库·oracle