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

如何阻止dbt在Databricks表创建脚本中插入无效U+FEFF字符?

问题:dbt在Databricks执行时出现U+FEFF语法错误

问题描述

在Databricks平台使用dbt创建表,此前操作均正常,本次执行失败。模型SQL脚本如下:

{% set key_columns = ['transaction_originator','dlk_bnz_insert_timestamp'] %}

{{
    config(alias='bnz_std_sqlbi01_user_transaction_file',
    materialized='table',
    unique_key=key_columns,
    file_format='delta'
    )
}}
SELECT
   TRIM(CAST(transaction_originator AS STRING)) AS transaction_originator,
   CAST(ab_number AS BIGINT) AS ab_number,
   TRIM(CAST(alpha_name AS STRING)) AS alpha_name,
   TRIM(CAST(emcu AS STRING)) AS emcu,
   CASE WHEN LOWER(active_user) = 'true' THEN True ELSE False END AS active_user,
   TRIM(CAST(location AS STRING)) AS location,
   TRIM(CAST(status AS STRING)) AS status,
   'sqlbi01' AS dlk_src_name,
   _metadata.file_modification_time AS dlk_bnz_insert_timestamp,
   CURRENT_TIMESTAMP() AS dlk_bnz_std_insert_timestamp
FROM {{ source('bronze', 'bnz_raw_sqlbi01_user_transaction_file') }}
WHERE transaction_originator IS NOT NULL

schema.yml配置无问题,执行时报错关键信息:

14:09:49    Database Error in model bnz_std_sqlbi01_user_transaction_file (models/bronze/bnz_std_sqlbi01_user_transaction_file.sql)
  
  [PARSE_SYNTAX_ERROR] Syntax error at or near '\uFEFF'. SQLSTATE: 42601 (line 16, pos 6)
  
  == SQL ==
  /* {"app": "dbt", "dbt_version": "1.9.4", "dbt_databricks_version": "1.10.1", "databricks_sql_connector_version": "4.0.3", "profile_name": "datalakehouse", "target_name": "databricks_cluster", "node_id": "model.datalakehouse.bnz_std_sqlbi01_user_transaction_file"} */
  
    
      
          create or replace table `dev`.`bronze`.`bnz_std_sqlbi01_user_transaction_file`
        
        using delta
        
        
        
        
        
        
        
        as
        \uFEFF
  ------^^^

U+FEFF字符的来源

U+FEFF是字节顺序标记(BOM),是UTF-8编码的特殊前缀,通常由编辑器保存文件时自动添加(当选择UTF-8 with BOM格式时)。你检查源文件未发现,可能的原因:

  • 你的dbt模型文件被意外保存为UTF-8 with BOM格式,多数编辑器默认不显示该字符
  • 引用的bronze层原始数据源文件带有BOM
  • dbt编译过程中,依赖的宏、模板文件引入了带BOM的内容

解决方法

1. 修复模型文件编码

用支持编码切换的编辑器(VS Code、Notepad++等)打开报错的模型文件:

  • VS Code:点击右下角编码标识→选择「通过编码保存」→选择「UTF-8」
  • Notepad++:顶部菜单「编码」→「转为UTF-8无BOM格式」
    保存后重新执行dbt run

2. 处理数据源的BOM字符

如果bronze层原始文件带有BOM,可在读取时清理:
在SELECT语句中对字符串列添加BOM去除逻辑:

TRIM(CAST(regexp_replace(transaction_originator, '^\uFEFF', '') AS STRING)) AS transaction_originator

或者在Databricks读取数据源时,指定编码为utf8(强制跳过BOM)

3. 清理dbt缓存

dbt缓存可能残留异常编译内容,执行以下命令清理:

dbt clean

之后重新执行dbt run

4. 检查依赖文件

检查项目中的自定义宏、模板文件(如macros/下的文件),确认是否有文件保存为UTF-8 with BOM格式,统一转为无BOM格式

验证方式

执行dbt compile后,查看target/compiled目录下生成的SQL文件,确认是否已移除\uFEFF字符,再执行dbt run

内容的提问来源于stack exchange,提问作者Chris Hunt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 03:33:21