Hi datayangl,

这是因为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

datayangl <[email protected]> 于2021年3月19日周五 下午4:02写道:

> 环境: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.toRetractStream[Row](data)
> result.print("====>")
> """
>
>
>
> 现象:如果判空条件为kafka_table.src_ip <> null,则程序直接结束,没有任何报错,而使用kafka_table.src_ip
> is
> not null 可以正常运行并一直产生数据。
>
> 疑问:我明白is not null是正确的用法,问题是用<> null 为什么程序会直接结束而且没有任何报错,感觉像是当作批处理去运行了。
>
>
>
> --
> Sent from: http://apache-flink.147419.n8.nabble.com/
>


-- 

Best,
Benchao Li

回复