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

Delta Live Tables读取同路径下指定文件时Schema意外合并的问题求助

Delta Live Tables读取同路径下指定文件时Schema意外合并的问题求助

看起来你碰到了DLT里一个挺让人头疼的小坑——明明给cloud_files()指定了fileNamePattern来过滤仅读取file_1相关的文件,但DLT还是把同目录下file_2的Schema也合并进来了,而且普通Auto Loader用相同逻辑却能正常工作,这确实很费解。我之前处理过类似的情况,给你几个可行的解决思路:

  • 先重置DLT Pipeline的状态,清除Schema缓存
    DLT会缓存Pipeline运行过程中推断出的Schema信息,哪怕你后来加了文件名过滤,如果第一次运行时(比如测试阶段)不小心扫到了其他文件,缓存的Schema就会一直保留。你可以在Databricks的DLT Pipeline页面,找到「Reset」选项,选择「Reset all data and compute」,然后重新启动Pipeline。这个操作会清空之前的状态和缓存,让DLT重新按照你指定的fileNamePattern去推断Schema。

  • 显式指定Schema,关闭自动推断
    依赖cloudFiles.inferColumnTypes自动推断Schema时,DLT可能会扫描目录下的所有文件来做全局推断(哪怕你指定了文件名模式)。解决办法是手动定义目标Schema,彻底关闭自动推断。比如在cloud_files的参数里直接传入明确的Schema定义,或者在CREATE TABLE时就指定好每一列的类型:

    CREATE OR REFRESH STREAMING LIVE TABLE table_number_1 (
      column_a STRING,
      column_b INT,
      column_c DATE,
      CONSTRAINT correct_schema EXPECT (_rescued_data IS NULL)
    )
    PARTITIONED BY (_JOB_UPDATED_PARTITION_YEAR, _JOB_UPDATED_PARTITION_MONTH)
    COMMENT "Comment for table 1"
    TBLPROPERTIES (
      -- 你的表属性保持不变
    )
    AS
    SELECT
      *,
      _metadata.file_path as _JOB_SOURCE_FILE,
      _metadata.file_name as _FILE_NAME,
      -- 其他衍生字段...
    FROM cloud_files(
      "abfss://<container>@<storage_account>.dfs.core.windows.net/path/to/folder/",
      'csv',
      map(
        'fileNamePattern', '*file_1*',
        -- 去掉inferColumnTypes,手动指定Schema
        'schema', 'column_a STRING, column_b INT, column_c DATE',
        -- 其他CSV配置选项保持不变
      )
    );
    

    这样DLT就只会按照你指定的Schema去解析文件,不会再去扫描其他文件的结构了。

  • 拆分文件到不同子目录(最稳妥的长期方案)
    如果业务允许的话,把file_1和file_2分别放到不同的子目录下,比如path/to/folder/file1_data/和path/to/folder/file2_data/,然后在cloud_files()里直接指定对应子目录的路径,而不是依赖文件名过滤。这种方式从根源上避免了不同Schema文件的干扰,也降低了后续新增其他文件时出现Schema问题的风险。

  • 检查DLT Pipeline的全局Schema合并设置
    确认你的Pipeline有没有开启全局的Schema自动合并功能——如果在Pipeline的配置里设置了pipelines.schemaMerge.enabled = true,这个全局配置会覆盖单个表的文件名过滤逻辑,导致DLT自动合并目录下所有文件的Schema。你可以在Pipeline的「Settings」里找到这个配置项,把它改成false。

另外补充一点:DLT的Auto Loader和普通的Auto Loader在状态管理上有差异,DLT是基于Pipeline的生命周期来缓存Schema和状态的,而普通Auto Loader是单次任务级别的,这也是为什么两者表现不一样的原因。

备注:内容来源于stack exchange,提问作者Arnold Souza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 07:04:52