开发者社区> 问答> 正文

Flink1.11执行sql当判空使用<> null,程序直接结束怎么办?

环境: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邮件归档

展开
收起
moonlightdisco 2021-12-01 14:00:21 1442 0
1 条回答
写回答
取消 提交回答
  • 这是因为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邮件归档

    2021-12-01 14:14:58
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载