如何阻止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
相关产品推荐
相关产品推荐

