DLT视图与物化视图语法及声明,银层视图类型咨询
我正在使用Medallion架构构建DLT管道,在Silver层采用CDC/SCD1按日期获取最新ID,目前运行正常,但对@dlt.view装饰器存在疑问。
当前管道结构如下:
BRONZE层
dlt.create_table(xxx) def bronze_table(): return(spark.readStream.transform(transformation_function))
SILVER层
根据CDC文档,由于流式表不支持直接作为apply_changes的源,我需要创建视图:
@dlt.view def view(): return dlt.readStream("bronze_table") dlt.create_streaming_table("target") dlt.apply_changes( # 相关CDC配置参数 )
我的问题是:我创建的这个视图是静态视图还是物化视图?DLT管道UI显示它只是普通视图,但我希望它是物化视图以尽可能降低延迟,充分利用DLT的优化能力。如果当前是静态视图,需要使用什么语法来创建物化视图?我尝试过dlt.table,但它仅创建了流式表,盼解答。
你用
@dlt.view创建的是虚拟视图(非物化):它仅定义了查询逻辑,不会持久化存储任何数据。每次被下游组件(比如apply_changes)引用时,才会执行对应的流式查询逻辑进行计算,没有预计算和存储结果,因此无法降低重复计算的延迟。要创建物化的流式中间层,直接使用
@dlt.table装饰器返回流式查询结果即可:
这种方式创建的是流式物化表,数据会被持久化存储在Delta表中,DLT会自动维护表的增量更新,相当于流式版本的物化视图。示例代码如下:@dlt.table(name="silver_intermediate", table_properties={"pipelines.reset.allowed": "true"}) def silver_intermediate(): # 这里可以加入你的预处理逻辑 return dlt.readStream("bronze_table").transform(your_transformation_func)之后在
apply_changes中直接引用这个物化的流式表作为源:dlt.create_streaming_table("target") dlt.apply_changes( target="target", source="silver_intermediate", keys=["your_key_column"], sequence_by="your_sequence_column", # 比如CDC的时间戳或操作序列ID apply_as_deletes="your_delete_flag_condition", # 其他SCD1相关配置 )关于你提到的
dlt.table创建流式表的问题:
当你用@dlt.table返回dlt.readStream的结果时,DLT会自动识别为流式表,这本身就是物化的——数据会被持久化存储,而非虚拟视图。这种表正是你需要的物化中间层,它会持续处理Bronze层的增量数据并存储结果,下游的apply_changes可以直接读取已存储的数据,减少重复计算,降低延迟。
内容的提问来源于stack exchange,提问作者Itachi07

