[
https://issues.apache.org/jira/browse/FLINK-31312?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17696099#comment-17696099
]
Jiang Xin commented on FLINK-31312:
-----------------------------------
[~xzw0223] Thanks for the reply.
>From the perspective of users, the `enableObjectReuse` is an optimization,
>removing this configuration should only cause a performance issue, rather than
>an exception. As you said, "the row object will construct its fields according
>to RowTypeInfo every time it is emitted", but this is the implementation
>detail, users only see inconsistent behaviors.
> EnableObjectReuse cause different behaviors
> -------------------------------------------
>
> Key: FLINK-31312
> URL: https://issues.apache.org/jira/browse/FLINK-31312
> Project: Flink
> Issue Type: Bug
> Components: API / DataStream
> Reporter: Jiang Xin
> Priority: Major
>
> I have the following test code which fails with the exception `Accessing a
> field by name is not supported in position-based field mode`, however, if I
> remove the `enableObjectReuse`, it works.
> The `SourceFunction` generates rows without field names, but the return type
> info is assigned by `env.addSource(rowGenerator, typeInfo)`.
> With object-reuse enabled, rows would be passed to the MapFunction directly,
> so the exception raises. While if the object-reuse is disabled, rows would
> be reconstructed and given field names when passing to the next operator and
> the test works well.
> {code:java}
> public static void main(String[] args) throws Exception {
> StreamExecutionEnvironment env =
> StreamExecutionEnvironment.getExecutionEnvironment();
> env.setParallelism(1);
> // The test fails with enableObjectReuse
> env.getConfig().enableObjectReuse();
> final SourceFunction<Row> rowGenerator =
> new SourceFunction<Row>() {
> @Override
> public final void run(SourceContext<Row> ctx) throws
> Exception {
> Row row = new Row(1);
> row.setField(0, "a");
> ctx.collect(row);
> }
> @Override
> public void cancel() {}
> };
> final RowTypeInfo typeInfo =
> new RowTypeInfo(new TypeInformation[] {Types.STRING}, new
> String[] {"col1"});
> DataStream<Row> dataStream = env.addSource(rowGenerator, typeInfo);
> DataStream<Row> transformedDataStream =
> dataStream.map(
> (MapFunction<Row, Row>) value ->
> Row.of(value.getField("col1")), typeInfo);
> transformedDataStream.addSink(new PrintSinkFunction<>());
> env.execute("Mini Test");
> } {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)