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排序。