flink sql 校验常见错误及解决办法

1.报错

Caused by: org.apache.calcite.runtime.CalciteContextException: From line 0, column 0 to line 80, column 25: Illegal mixing of types in CASE or COALESCE statement
原因:CASE WHEN 语句中存在类型不匹配的问题。比如说

case 
when reg_fee like '%美元' then 11.0
else 10
end  as "费用"

解决:这个就要把else 后面的10改为10.0,修改后代码

case 
when reg_fee like '%美元' then 11.0
else 10.0
end  as "费用"

简单讲,就是then 后面的值 要跟else后面的值类型相同,要么都是整形要么都是字符型,不一样就自己cast。

2.报错

org.apache.flink.table.api.ValidationException: SQL validation failed. From line 0, column 0 to line 74, column 58: Cannot apply '*' to arguments of type '<VARCHAR(2147483647)> * <DECIMAL(6, 1)>'. Supported form(s): '<NUMERIC> * <NUMERIC>' '<DATETIME_INTERVAL> * <NUMERIC>' '<NUMERIC> * <DATETIME_INTERVAL>'
原因:这里的’*'符号是相乘的意思,相乘两边的值类型不匹配,一个varchar 一个是decimal
解决:两边类型转成一样的。

3.报错

Caused by: java.lang.IllegalArgumentException: Either all or none of the following options should be provided: lookup.cache.max-rows lookup.cache.ttl
原因:这两个参数要么同时存在,要么同时不存在
解决:看自己需要,如果跑批任务的话,加不加都行,反正跑完内存就释放了。

4.报错

Caused by: java.lang.ClassCastException: class java.lang.Boolean cannot be cast to class java.lang.Integer (java.lang.Boolean and java.lang.Integer are in module java.base of loader 'bootstrap')
原因:这个报错是在任务提交运行时报错,flink会把tinyint 自动转成boolean类型,假设sql里面有

where deleted = 0

这种条件,而deleted的定义恰好是tinyint,可能会报这个错误。
解决:在jdbc链接后面拼上参数

&tinyInt1isBit=false&transformedBitIsBoolean=false

5.其他常见坑

5.1as后面的别名不能有单引号,如果跟关键词冲突可以加``。
5.2 flink sql都是单引号,没有双引号,双引号语法校验不通过。
5.3date为关键字,必须加``。
5.4null作为单个字段使用时需要加单引号’',比如case when else 'null'
case when name is not null,这种就不需要加单引号。
5.5 CURRENT_TIMESTAMP() 需要去掉括号。
5.6不能用order by排序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值