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...

相关推荐
m***11901 小时前
Windows版Redis本地后台启动
数据库·windows·redis
梁bk1 小时前
Redis 内存回收
数据库·redis·缓存
菜鸟小九1 小时前
mysql运维(日志)
运维·数据库·mysql
SelectDB2 小时前
Apache Doris 实时更新全解:从设计原理到最佳实践|Deep Dive
数据库·apache
纪莫2 小时前
技术面:如何解决缓存和数据库一致性的问题?
数据库·redis·java面试⑧股
番茄你个西红42 小时前
安装KingbaseES时服务器swap的设置
linux·数据库
是一个Bug2 小时前
Spring事件监听器源码深度解析
java·数据库·spring
Wang's Blog2 小时前
MongoDB小课堂: 分片集群架构深度解析与生产级优化指南
数据库·mongodb·架构
万邦科技Lafite2 小时前
API接口地址解析地区码操作指南
网络·数据库·redis·缓存·开放api·电商开放平台