谢谢。 其实,如果从DataStream编程的角度上来说,下游是能够收到一个Tuple2类型的数据,也就是能够硬编码处理retract的结果。 但是对于Table API&SQL来说,特别是SQL,内置函数本身并没有一个增加处理Retract的逻辑(当然,可能内置算子已经包含了,我没有去看而已)。 我在编写UDAF的时候,里面有个retract方法,注释写的是: This function must be implemented for datastream bounded over aggregate 。 是否说只有over window的时候才有retract? 另外,对于我们写的UDF,UDTF,其实也没有提供retract的方式,毕竟传入的参数只是字段值,而没有DataStream中的Tuple2中的Boolean值。其他的内置方法也一样,好像对于retract的处理,sql中只有UDAF里面有所提及。
Benchao Li <libenc...@gmail.com> 于2020年4月23日周四 下午3:59写道: > 这个暂时还没有一篇文档来介绍这部分内容。如果你要了解全部细节,可能只能从源码的角度来了解了。 > > lec ssmi <shicheng31...@gmail.com> 于2020年4月23日周四 下午3:45写道: > > > 这个难道没有一个列表,或者是配置开关之类的吗?难道只能一个一个地尝试?各种算子连接在一起,更难判断了。 > > > > > > Benchao Li <libenc...@gmail.com> 于2020年4月23日周四 下午3:39写道: > > > > > Hi lec, > > > > > > 1.retract在什么时候触发呢?是有groupby或者窗口就默认retract吗,还是需要配置? > > > > > > 这个是某些算子会有这个行为,比如普通的group by,就会发送retract消息。 > > > 另外有一些算子是在某些特定配置下才会有这个行为,比如window operator,在配置了early fire或者late fire的时候。 > > > 还有些算子本身不会产生,但是会传递,比如calc算子 > > > > > > 2.如果上游操作有retract,那么不是所有的下游都带有retract性质了?不然下游计算的数据就不准了。 > > > > > > 这个也不绝对。大部分时候是。 > > > 这个取决于这个算子本身是不是会consume > > > retraction,目前我好想没见到有算子会消费retraction,但是不产生retraction的。 > > > > > > > 3.sql操作的话,如果上游是有retract的,那下游select然后print,会把DELETE和INSERT这两条记录都print出来? > > > > > > 是的。 > > > > > > lec ssmi <shicheng31...@gmail.com> 于2020年4月23日周四 下午3:25写道: > > > > > > > Hi: > > > > 有几个问题想咨询下大佬: > > > > 1.retract在什么时候触发呢?是有groupby或者窗口就默认retract吗,还是需要配置? > > > > 2.如果上游操作有retract,那么不是所有的下游都带有retract性质了?不然下游计算的数据就不准了。 > > > > > > 3.sql操作的话,如果上游是有retract的,那下游select然后print,会把DELETE和INSERT这两条记录都print出来? > > > > > > > > > > > > > -- > > > > > > Benchao Li > > > School of Electronics Engineering and Computer Science, Peking > University > > > Tel:+86-15650713730 > > > Email: libenc...@gmail.com; libenc...@pku.edu.cn > > > > > > > > -- > > Benchao Li > School of Electronics Engineering and Computer Science, Peking University > Tel:+86-15650713730 > Email: libenc...@gmail.com; libenc...@pku.edu.cn >