前几天上线了一个模型,伪代码如下:
代码语言: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生成语法树的时候造成报错:系统认为脚本到此为一个段落的结束,进而产生上述的报错。
这里的问题很小,但在平时上线或者实践的时候,可能被很大一部分人忽视,结果造成了较大的运维成本,希望大家可以看到这儿有所收获,有所谨记。