Databricks Delta Live Table身份列全为NULL问题求助
Delta Live Tables中IDENTITY列全为NULL的问题排查与解决
核心原因
在Delta Live Tables(DLT)中,使用CREATE OR REFRESH STREAMING LIVE TABLE ... AS SELECT语法创建表时,即便定义了GENERATED ALWAYS AS IDENTITY列,DLT也不会自动为该列生成值——这种语法是直接将查询结果映射到目标表,IDENTITY列的自动生成逻辑不会被触发,这和SQL Server的行为存在差异。
另外你尝试的两个函数报错原因:
monotonically_increasing_id()是Spark SQL函数,但DLT流查询场景下无法直接用它生成唯一键,且会触发语法校验报错identity()并非Spark SQL内置函数,直接调用必然报错
解决方案
方案1:使用APPLY CHANGES INTO语法(推荐支持更新/CDC的场景)
如果源表支持变更数据捕获,或后续需要更新表数据,可通过该语法构建表,此时IDENTITY列会自动生成值:
CREATE OR REFRESH LIVE TABLE my_dlt ( dlt_id BIGINT GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1), source_column1 STRING, source_column2 STRING, PRIMARY KEY (dlt_id) ) TBLPROPERTIES (delta.enableChangeDataFeed = true, "quality" = "silver"); APPLY CHANGES INTO LIVE.my_dlt FROM stream(source_catalog.bronze_schema.source_table) KEYS (source_column1, source_column2) -- 用源表唯一键判断重复数据 SEQUENCE BY <timestamp_column> -- 指定处理乱序事件的时间列(如源表的更新时间) COLUMNS (source_column1, source_column2);
方案2:在查询中直接生成唯一ID(适合纯流处理、无需更新的场景)
如果不需要后续更新表数据,可直接在查询中生成唯一标识:
- 生成全局唯一字符串ID(无冲突风险):
CREATE OR REFRESH STREAMING LIVE TABLE my_dlt ( dlt_id STRING, source_column1 STRING, source_column2 STRING ) TBLPROPERTIES (delta.enableChangeDataFeed = true, "quality" = "silver") AS WITH stream_input AS ( SELECT DISTINCT source_column1, source_column2 FROM stream(source_catalog.bronze_schema.source_table) ) SELECT uuid() as dlt_id, source_column1, source_column2 FROM stream_input;
- 若需要整数类型ID,可通过
hash(uuid())转换,但存在极低哈希冲突风险,适用于对唯一性要求不极端的场景。
排查要点
- 确认DLT表创建语法:
AS SELECT模式下IDENTITY列不会自动填充,属于DLT设计逻辑 - 核对函数合法性:Spark SQL无
identity()函数,monotonically_increasing_id()不兼容DLT流查询 - 检查表属性:
delta.enableChangeDataFeed等属性不影响IDENTITY列生成,无需为此调整
内容的提问来源于stack exchange,提问作者SQLDoug
相关产品推荐
相关产品推荐

