Dataworks实践—关于一条注释引发的生产报错

2024-08-12 16:55:25 浏览数 (1)

前几天上线了一个模型,伪代码如下:

代码语言:sql复制
insert overwrite table yht_dw.xxx partition (pt='20240807')
select 
        id,                                                  -- id
        entity_id,                                           -- 单据id
        settlement_office_id,                                -- 结算主体id
        settlement_company_id,                               -- 结算单位id
        settlement_mode,                                     -- 结算方式
        estimate_amount,                                     -- 预估金额
        confirmation_no,
        confirmation_date,                                   -- 确认单日期
        forward_confirmation_state,                          -- 组合确认状态,根据确认状态与调整状态展示
        confirmation_state,                                  -- 确认单状态
        ar_ap,                                               -- 收付方向*
        currency,
        amount,                                              -- 金额
        bank_account,
        contract_no,                                         -- 合同编号
        forward_entry_state,                                 -- 组合入账状态,根据入账状态与调整状态展示
        adjust_state,                                        -- 调整状态 1 无 2 调整中 3 已调整
        entry_state,                                         -- 入账状态
        entry_amount,                                        -- 账单金额,影响账单金额的操作
        invoice_apply_state,                                 -- 开票申请状态,待申请状态的费用才可申请开票
        invoice_apply_amount,                                -- 开票申请金额,影响开票申请金额的操作
        invoice_state,                                       -- 开票申请;
        current_timestamp() as etl_time
from yht_dw.ods_cw_fin_charge_base_di
where pt='${bizdate}'

在上线之前,通过Studio进行了脚本的验证,整个逻辑是验证通过的,脚本正常运行。因此将任务发布到任务发布后即没有进行模型测试,直接上线到生产环境中。第二天发现任务报错,而且报了很奇怪的错误,如下图:

这是提示我脚本中有无效的字符“,",但是我通篇看下来,脚本内的,都是英文状态下半角,并且不存在多余的错误的符号,因此可能并不是,的原因。通过几个任务的相同报错来看我将问题定位到了注释的位置:

图片中日志的红色框线位置,而且我在想是不是有可能是这里的;影响到了脚本的执行。因为Dataworks执行脚本的时候是将;作为一个脚本的结束以及另一个脚本的开始。那么我就开始修改,将处于注释末尾的;全部删除然后再上线,经过测试,发现确实脚本成功的执行了。

这里我猜测,Dataworks中SQL执行的时候,会先寻找第一个处于某一行结尾的;来确定脚本的结束位置,在这个情况下,它不会辨别这个;是否存在于注释中。以本文的错误为例,它认为开票申请后;即为第一段脚本的结束,因此,invoice_state后跟着的,就变成了invalid token ',',以至于它的这个报错就是可以理解的了。同时也提示我们,在注释中避免使用;,该符号很容易被解析sql生成语法树的时候造成报错:系统认为脚本到此为一个段落的结束,进而产生上述的报错。

这里的问题很小,但在平时上线或者实践的时候,可能被很大一部分人忽视,结果造成了较大的运维成本,希望大家可以看到这儿有所收获,有所谨记。

0 人点赞