简体   繁体   中英

How to define an apache flink table with row time attribute

I have json rows coming as my data, I want to create a table out of it.

StreamTableEnvironment fsTableEnv = StreamTableEnvironment.create(streamExecutionEnvironment, fsSettings);
String allEventsTable = "allEventsTable";
        fsTableEnv.connect(new Kafka()
                            .version("0.11")
                            .topic("events")
                            .property("bootstrap.servers", "localhost:9092")
                            .property("group.id", "dummyquery").startFromLatest())
                .withSchema(new Schema()
                    .field("rule_id", Types.INT)
                    .field("sourceAddress", Types.STRING)
                    .field("deviceProduct", Types.STRING)
                    .field("destHost", Types.STRING)
                    .field("extra", Types.STRING)
                    .field("rowtime", Types.SQL_TIMESTAMP)
                        .rowtime(new Rowtime().timestampsFromField("rowtime").watermarksPeriodicBounded(2000))

                )
                .withFormat(new Json().failOnMissingField(false).deriveSchema())
                .inAppendMode()
                .registerTableSource(allEventsTable);

         Table result = fsTableEnv.sqlQuery("select * from allEventsTable where sourceAddress='12345431'");

        DataStream alert = fsTableEnv.toAppendStream(result, Row.class);
        alert.print();

However, on running the job I get the error

Exception in thread "main" org.apache.flink.table.api.ValidationException: Field 'rowtime' could not be resolved by the field mapping.
    at org.apache.flink.table.sources.TableSourceValidation.resolveField(TableSourceValidation.java:245)
    at org.apache.flink.table.sources.TableSourceValidation.lambda$validateTimestampExtractorArguments$6(TableSourceValidation.java:202)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:545)
    at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
    at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:438)

Ps. I am using flink 1.9

My json data which I am putting in kafka topic events is like

{"rule_id":"", "rowtime":"2020-07-23 13:10:13","sourceAddress":"12345433","deviceProduct":"234r5t", "destHost":"876543", "extra":"dummy"}

I am afraid this is a bug. I created https://issues.apache.org/jira/browse/FLINK-15801 to track it.

You should be able to work it around if you change one of the field names in your rowtime definitions. Change either the name of the logical field:

.field("timeAttribute", Types.SQL_TIMESTAMP)
    .rowtime(new Rowtime().timestampsFromField("rowtime").watermarksPeriodicBounded(2000))

or the physical field of origin:

.field("rowtime", Types.SQL_TIMESTAMP)
    .rowtime(new Rowtime().timestampsFromField("timestamp").watermarksPeriodicBounded(2000))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM