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

Yahya Kisana commented on FLINK-41293:
--------------------------------------

Hi, can I take this? 

> PyFlink batch: pandas UDAF over ROWS BETWEEN n PRECEDING AND k PRECEDING (k 
> >= 2) aggregates rows outside the frame for the first rows of a partition
> -----------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: FLINK-41293
>                 URL: https://issues.apache.org/jira/browse/FLINK-41293
>             Project: Flink
>          Issue Type: Bug
>          Components: API / Python
>    Affects Versions: 2.1.1, 2.3.0
>            Reporter: Yaoxuan Wu
>            Priority: Major
>              Labels: correctness
>
> {code:python}
> from pyflink.table import EnvironmentSettings, TableEnvironment, DataTypes as 
> D
> from pyflink.table.udf import udaf
> t_env = TableEnvironment.create(EnvironmentSettings.in_batch_mode())
> t_env.get_config().set('parallelism.default', '1')
> t_env.create_temporary_view('t', t_env.from_elements([(i,) for i in range(1, 
> 6)], D.ROW([D.FIELD('o', D.INT())])))
> t_env.create_temporary_function('pandas_list',
>     udaf(lambda s: str(list(s)), result_type=D.STRING(), func_type='pandas'))
> t_env.execute_sql("""SELECT o, pandas_list(o) OVER (ORDER BY o ROWS BETWEEN 2 
> PRECEDING AND 2 PRECEDING) AS w
>                      FROM t""").print()
> # expected: o=1 [], o=2 [], o=3 [1], o=4 [2], o=5 [3]
> # actual:   o=1 [1, 2, 3, 4], o=2 [], o=3 [1], o=4 [2], o=5 [3]
> {code}
> Native {{COUNT(o)}} over the same frame gives 0, 0, 1, 1, 1; the pandas UDAF 
> sees 4 rows for o=1. {{ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING}} and {{ROWS 
> BETWEEN 1 FOLLOWING AND 2 FOLLOWING}} are correct.
> Cause: 
> {{PandasBatchOverWindowAggregateFunctionOperation.wrapped_over_window_function}}
>  (pyflink/fn_execution/table/operations.py), row sliding window:
> {code:python}
> start = max(j + window_start, 0)
> end = min(j + window_end + 1, input_cnt)
> series_slices = [s.iloc[start: end] for s in input_series]
> {code}
> {{end}} is clamped from above but not from below. With an upper bound of k 
> PRECEDING ({{window_end = -k}}), {{end = j - k + 1}} is negative for the 
> first k - 1 rows, and pandas reads a negative stop from the end of the series 
> ({{iloc[0:-1]}} = all rows but the last). For k = 1, {{end = 0}} and the 
> frame is correctly empty. The {{ROW_UNBOUNDED_PRECEDING}} branch ({{s.iloc[: 
> end]}} with the same {{end}}) has the same unclamped end for {{UNBOUNDED 
> PRECEDING AND k PRECEDING}}.
> Reproduces on 2.0.1, 2.2.1, 2.3.0 and master.



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

Reply via email to