[ 
https://issues.apache.org/jira/browse/FLINK-10100?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Aljoscha Krettek closed FLINK-10100.
------------------------------------
    Resolution: Won't Fix

We're not actively developing the DataSet API anymore.

> Optimizer pushes partitioning past Null-Filter
> ----------------------------------------------
>
>                 Key: FLINK-10100
>                 URL: https://issues.apache.org/jira/browse/FLINK-10100
>             Project: Flink
>          Issue Type: Bug
>          Components: API / DataSet
>    Affects Versions: 1.3.3, 1.4.2, 1.5.2, 1.6.0, 1.7.0
>            Reporter: Fabian Hueske
>            Priority: Critical
>
> The DataSet optimizer pushes certain operations like partitioning or sorting 
> past Filter operators.
> It does that because it knows that a {{FilterFunction}} cannot modify the 
> records but only indicate whether a record should be forwarded or not. 
> However, this causes problems if the filter should remove records with null 
> keys. In that case, the partitioning can be pushed past the filter such that 
> the partitioner has to deal with null keys. This can fail with a 
> {{NullPointerException}}.
> The following code produces an affected plan.
> {code}
> List<Row> rowList = new ArrayList<>();
> rowList.add(Row.of(null, 1L));
> rowList.add(Row.of(2L, 2L));
> rowList.add(Row.of(2L, 2L));
> rowList.add(Row.of(3L, 3L));
> rowList.add(Row.of(null, 3L));
> DataSet<Row> rows = env.fromCollection(rowList, Types.ROW(Types.LONG, 
> Types.LONG));
> DataSet<Long> result = rows
>   .filter(r -> r.getField(0) != null)
>     .setParallelism(4)
>   .groupBy(0)
>   .reduceGroup((Iterable<Row> vals, Collector<Long> out) -> {
>       long cnt = 0L;
>       for(Row v : vals) { cnt++; }
>         out.collect(cnt);
>       }).returns(Types.LONG)
>         .setParallelism(4);
> result.output(new DiscardingOutputFormat());
> System.out.println(env.getExecutionPlan());
> {code}
> To resolve the problem, we could remove the field-forward property of 
> {{FilterFunction}}. In general, it is typically more efficient to filter 
> before shipping or sorting data. So this might also improve the performance 
> of certain plans.
> As a *workaround* until this bug is fix, users can implement the filter with 
> a {{FlatMapFunction}}. {{FlatMapFunction}} is a more generic interface and 
> the optimizer cannot automatically infer how the function behaves and won't 
> push partitionings or sorts past the function.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to