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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:50:28