You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Databricks中为流表添加ID并编写DLT管道的SQL声明?

流式DLT表实现SQL

针对你的需求,以下是Databricks Delta Live Tables(DLT)的流式SQL实现方案:

1. 地址维度表 silver_address

这个表需要对bronze表中的City+Country组合去重,并生成唯一整数ID,提供两种常用实现方式:

方式1:基础流式去重+生成ID

适合不需要后续动态更新地址的场景,直接从bronze表流式读取并去重,用窗口函数生成ID:

CREATE OR REFRESH STREAMING LIVE TABLE silver_address
COMMENT '流式地址维度表,存储唯一地址信息'
AS
WITH unique_addresses AS (
  -- 从bronze流中提取唯一的地址组合
  SELECT DISTINCT City, Country
  FROM STREAM(live.bronze_table)
)
SELECT
  -- 按City+Country排序生成自增整数ID
  ROW_NUMBER() OVER (ORDER BY City, Country) AS ID,
  City,
  Country
FROM unique_addresses;

方式2:支持动态更新的维度表(推荐)

如果后续bronze表会新增新地址,用APPLY CHANGES确保地址不重复插入,同时用IDENTITY列自动生成自增ID:

-- 创建临时表存储去重后的地址流数据
CREATE OR REFRESH STREAMING LIVE TABLE silver_address_raw
COMMENT '临时存储去重后的地址流数据'
AS
SELECT DISTINCT City, Country
FROM STREAM(live.bronze_table);

-- 创建最终维度表,自动生成自增ID
CREATE OR REFRESH LIVE TABLE silver_address
COMMENT '流式地址维度表,自动维护唯一地址与自增ID'
(
  City STRING,
  Country STRING,
  ID INT GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1)
)
TBLPROPERTIES ('delta.enableChangeDataFeed' = 'true');

-- 合并数据,确保同一地址仅插入一次
APPLY CHANGES INTO live.silver_address
FROM STREAM(live.silver_address_raw)
KEYS (City, Country) -- 用地址组合作为唯一键去重
SEQUENCE BY __timestamp; -- 按数据时间戳处理顺序

2. 人员主表 silver_people

关联silver_address获取地址ID,同时生成人员唯一ID:

基础实现(窗口函数生成ID)

CREATE OR REFRESH STREAMING LIVE TABLE silver_people
COMMENT '流式人员主表,关联地址维度'
AS
SELECT
  -- 按Name排序生成人员自增ID
  ROW_NUMBER() OVER (ORDER BY b.Name) AS ID,
  b.Name,
  sa.ID AS Address_ID
FROM STREAM(live.bronze_table) b
-- 关联地址维度表获取对应的Address_ID
JOIN live.silver_address sa
ON b.City = sa.City AND b.Country = sa.Country;

支持动态更新的实现(IDENTITY列)

如果需要人员ID自动自增且不重复,用IDENTITY列更可靠:

CREATE OR REFRESH STREAMING LIVE TABLE silver_people
COMMENT '流式人员主表,带自增ID并关联地址维度'
(
  Name STRING,
  Address_ID INT,
  ID INT GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1)
)
AS
SELECT
  b.Name,
  sa.ID AS Address_ID
FROM STREAM(live.bronze_table) b
JOIN live.silver_address sa
ON b.City = sa.City AND b.Country = sa.Country;

关键注意点

  • STREAM(live.bronze_table):表示读取bronze表的流式数据,确保处理实时流入的记录
  • IDENTITY列:DLT支持自动生成自增整数ID,比窗口函数更适合动态流式场景,避免重复ID
  • APPLY CHANGES INTO:用于维度表的缓慢变化处理(SCD Type 1),确保同一地址只被存储一次
  • 关联逻辑:通过City和Country字段将人员数据与地址维度关联,获取对应的Address_ID

内容的提问来源于stack exchange,提问作者redford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:14:52