环境:flink1.11: 代码如下: val dataStreamEnv: StreamExecutionEnvironment = FlinkUtils.streamEnv val tableEnv: StreamTableEnvironment = FlinkUtils.streamTableEnv val sql = """SELECT CASE WHEN kafka_table.log_type = 'detect' AND kafka_table.event_level = 3 THEN 3 ELSE 0 END as weight, kafka_table.src_ip as kafka_table_src_ip_0, kafka_table.dev_type as kafka_table_dev_type_0 FROM kafka_table WHERE kafka_table.event_time >= unix_timestamp() - 60 * 60 * 5 AND kafka_table.src_ip <> null AND kafka_table.event_level > 0 AND kafka_table.dev_type = 1
val data:Table = tableEnv.sqlQuery(sql) val result = tableEnv.toRetractStreamRow result.print("====>") """
现象:如果判空条件为kafka_table.src_ip <> null,则程序直接结束,没有任何报错,而使用kafka_table.src_ip is not null 可以正常运行并一直产生数据。
疑问:我明白is not null是正确的用法,问题是用<> null 为什么程序会直接结束而且没有任何报错,感觉像是当作批处理去运行了。*来自志愿者整理的flink邮件归档
这是因为kafka_table.src_ip <>
null是恒等于false的,所以这个计算过程就被优化掉了,最后你的作业的逻辑就变成了一个单纯的values,里面没有一条数据。
关于为什么kafka_table.src_ip <> null,这个可以了解一下关于three-value-logic[1].
简单来说,在标准SQL里面,boolean类型是有三种值的,正常的= <>这种算子跟null比较的时候,结果都是unknown,
然后这个在filter条件里面会被视作false。
[1] https://modern-sql.com/concept/three-valued-logic*来自志愿者整理的flink邮件归档
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。