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

Delta Live Table物化视图数据被覆盖,如何配置为追加模式?

Delta Live Table 追加数据问题解决

首先你报错是因为mergeMode根本不是@dlt.table或物化视图装饰器的合法参数,这个参数是Spark流处理writeStream里的配置,不能直接套在DLT的表定义上。

你现在的核心问题是用了物化视图,而物化视图的特性就是每次运行流水线都会重新计算全量数据,直接替换原有表内容,所以才会出现旧数据被删、只留新数据的情况。要实现追加,得换个思路:

方案1:改用普通DLT表 + 增量加载逻辑

放弃物化视图,用@dlt.table定义普通表,然后在数据处理逻辑里只读取当日的增量数据,DLT默认会把这些新数据追加到已有表中。示例代码:

import dlt
from pyspark.sql.functions import current_date

@dlt.table(
    name="daily_sales",
    comment="每日销售增量数据表"
)
def create_daily_sales():
    # 读取当日分区的增量数据源,比如按日期划分的CSV文件
    return (
        spark.read.format("csv")
        .load(f"/path/to/sales_data/{current_date()}")
        .select("order_id", "amount", "customer_id")
    )

方案2:用apply_changes实现合并追加(适合无法过滤增量的场景)

如果你的数据源没法直接筛选当日数据,必须全量读取但要避免重复插入,可以用DLT的apply_changes API,基于主键判断只追加新记录:

import dlt

# 先定义全量读取的源表
@dlt.table(name="raw_sales")
def create_raw_sales():
    return spark.read.format("csv").load("/path/to/all_sales_data")

# 基于主键合并数据到目标表,只新增未存在的记录
dlt.apply_changes(
    target="daily_sales",
    source="raw_sales",
    keys=["order_id"],  # 用订单ID作为唯一标识
    apply_as_deletes=False,
    sequence_by="order_timestamp",  # 按订单时间确定数据顺序
    except_column_list=["_rescued_data"]
)

记住:物化视图的定位是让表数据和源数据完全同步,刷新就会全量替换,所以要增量追加就别用物化视图。

内容的提问来源于stack exchange,提问作者data-explore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:42:32