(已解决) 关于遍历复用中的两个小问题

遍历复用的用途是把同一批数据重复遍历多次的计算变成遍历一次,虽然计算总量没变,但遍历次数少了,简单理解成这样应该没错吧?那是不是总的耗时也会减少,少了重复遍历的时间?

举个简单的例子,文件是一个 2250 万行 3 列的 btx,要聚合一些列。

第一种方法是每一次聚合重新写一遍,如下截图所示:

imagepng

第二种方法是用 cursor…cursor 的方法,遍历复用,如下所示:

imagepng

我原本以为第二种方法应该会快一些,但实际运行结果是两种写法的总耗时是一样的。然后,还有一个发现,在用管道时,不管是 cursor…cursor,还是 channel 方法,在 groups 时,聚合后再进行一次运算,主键就不存在了。可以从上述截图中观察,第一种方法,不管是否聚合,聚合后是否再运算,groups 之后都会自动生成主键,但在遍历复用时,聚合后再计算主键就丢失了,就像上图中的 B4 代码格,1/icount()或者 icount()+0,主键就没有了。所以,

1、遍历复用的时间是怎么算的?就像此例,常规写法和遍历复用耗时没区别,只是写法上更整齐优雅;
2、遍历复用时,聚合后再计算主键能不丢失吗?
3、groups 聚合时,可以用 icount 直接不重复计数,那可不可以直接去重后累加或者去重后 concat,比如聚合后 [1,2,1],去重后累加变成 sum([1,2]),concat@c([1,2]) 这种效果(有其它方法实现,先按两列聚合,再聚合一次,用两次 groups);比如以下例子:

imagepng

或者用 iterate 实现去重累积,但 iterate 在多路游标时不能用。

imagepng

4、多路游标 groups 聚合时不能用 iterate。如下截图所示,用了 cursor@m(),如果不用 @m 是可以 iterate 的,函数文档里好像也没有说明:

imagepng

以上问题,可能是我写法不对或者理解有偏差,也有可能是举例不当,不过,还是恳请大佬们得闲时给予指导解惑,谢谢!