[ 
https://issues.apache.org/jira/browse/FLINK-41179?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18132175#comment-18132175
 ] 

dylanhz commented on FLINK-41179:
---------------------------------

Hi [~thaddywu] , thanks for reporting this issue! Are you currently working on 
a fix? If not, I’d be happy to take it on.

> VAR_POP / STDDEV_POP give wrong, non-deterministic results with mini-batch 
> two-phase aggregation over an updating input
> -----------------------------------------------------------------------------------------------------------------------
>
>                 Key: FLINK-41179
>                 URL: https://issues.apache.org/jira/browse/FLINK-41179
>             Project: Flink
>          Issue Type: Bug
>          Components: Table SQL / Runtime
>    Affects Versions: 2.3.0
>            Reporter: Yaoxuan Wu
>            Priority: Major
>
> {code:python}
> from collections import Counter
> from pyflink.common import Configuration
> from pyflink.table import DataTypes as D, EnvironmentSettings, 
> TableEnvironment
> c = Configuration()
> for k, v in [('parallelism.default', '1'), ('table.exec.mini-batch.enabled', 
> 'true'),
>              ('table.exec.mini-batch.allow-latency', '10 ms'), 
> ('table.exec.mini-batch.size', '2'),
>              ('table.optimizer.agg-phase-strategy', 'TWO_PHASE')]:
>     c.set_string(k, v)
> t = 
> TableEnvironment.create(EnvironmentSettings.new_instance().in_streaming_mode().with_configuration(c).build())
> t.create_temporary_view('t', t.from_elements(
>     [(1, 1.0), (1, 2.0), (1, 4.0), (2, 10.0), (2, 20.0), (3, 7.0), (3, 1.0)],
>     D.ROW([D.FIELD('k', D.INT()), D.FIELD('x', D.DOUBLE())])))
> final = Counter()   # fold the changelog into the final result
> with t.execute_sql("SELECT VAR_POP(s), AVG(s) FROM (SELECT k, SUM(x) AS s 
> FROM t GROUP BY k)").collect() as it:
>     for r in it:
>         final[tuple(r)] += 1 if str(r.get_row_kind()) in ('+I', '+U') else -1
> print([k for k, n in final.items() if n > 0])
> # SUM per k = 7, 30, 8
> # expected: [(112.666..., 15.0)]
> # actual (varies between runs): [(130.888..., 15.0)], [(9.555..., 15.0)], ...
> {code}
> AVG / SUM / COUNT of the same input are correct; VAR_POP, VAR_SAMP, 
> STDDEV_POP and STDDEV_SAMP are wrong. Correct without mini-batch, with 
> {{ONE_PHASE}}, in batch mode, and on 2.2.1.
> Cause: since FLINK-38740 the variance functions use {{WelfordM2AggFunction}}. 
> With mini-batch two-phase aggregation, {{MiniBatchLocalGroupAggFunction}} 
> starts each bundle from a fresh accumulator, so a bundle with {{-U(s1), 
> +U(s2)}} first takes the local count to -1. But 
> {{WelfordM2AggFunction.retract}} and {{accumulate}} return early when {{acc.n 
> <= 0}} (dropping the value), and {{merge}} only adds the count of an 
> accumulator with {{n <= 0}}. So the global accumulator still has s1 in mean / 
> m2 and never sees s2.
> Reproduces on 2.3.0 and master; 2.2.1 is correct.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to