Apache flink Flink嵌套类到数据流转换错误

Apache flink Flink嵌套类到数据流转换错误,apache-flink,flink-streaming,flink-table-api,Apache Flink,Flink Streaming,Flink Table Api,我使用的是flink 1.13。我试图用下面的方法将表结果转换为数据流,但不断出现错误 public class HybridTrial { public static class Address { public String street; public String houseNumber; public Address() {} public Address(String street, String houseNumber) { th

我使用的是flink 1.13。我试图用下面的方法将表结果转换为数据流,但不断出现错误

public class HybridTrial {
  public static class Address {
    public String street;
    public String houseNumber;

    public Address() {}

    public Address(String street, String houseNumber) {
      this.street = street;
      this.houseNumber = houseNumber;
    }
  }

  public static class User {
    public String name;

    public Integer score;

    public LocalDateTime event_time;

    public Address address;

    // default constructor for DataStream API
    public User() {}

    // fully assigning constructor for Table API
    public User(String name, Integer score, LocalDateTime event_time, Address address) {
      this.name = name;
      this.score = score;
      this.event_time = event_time;
      this.address = address;
    }
  }

  public static void main(String[] args) throws Exception {
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    DataStream<User> dataStream =
        env.fromElements(
                new User("Alice", 4, LocalDateTime.now(), new Address()),
                new User("Bob", 6, LocalDateTime.now(), new Address("NBC", "204")),
                new User("Alice", 10, LocalDateTime.now(), new Address("ABC", "1033")))
            .assignTimestampsAndWatermarks(
                WatermarkStrategy.<User>forBoundedOutOfOrderness(Duration.ofSeconds(60)));

    StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
    Table table =
        tableEnv.fromDataStream(
            dataStream, Schema.newBuilder().build());

    table.printSchema();

    Table t = table.select($("*"));

    DataStream<User> dsRow = tableEnv.toDataStream(t,User.class);
    dsRow.print();

    env.execute();
  }
}
公开类杂交试验{
公共静态类地址{
公众街;;
公共字符串编号;
公共广播(){}
公共广播(字符串街道、字符串门牌号){
这条街;
this.houseNumber=houseNumber;
}
}
公共静态类用户{
公共字符串名称;
公众整数分;
公共LocalDateTime事件\ u时间;
公共广播;
//DataStream API的默认构造函数
公共用户(){}
//为表API完全分配构造函数
公共用户(字符串名称、整型分数、LocalDateTime事件\ U时间、地址){
this.name=名称;
这个分数=分数;
this.event\u time=事件时间;
this.address=地址;
}
}
公共静态void main(字符串[]args)引发异常{
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
数据流数据流=
环境元素(
新用户(“Alice”,4,LocalDateTime.now(),新地址()),
新用户(“Bob”,6,LocalDateTime.now(),新地址(“NBC”,“204”),
新用户(“Alice”,10,LocalDateTime.now(),新地址(“ABC”,“1033”))
.1.1.1.2水印(
水印策略。用于边界自动识别(持续时间为秒(60));
StreamTableEnvironment tableEnv=StreamTableEnvironment.create(env);
餐桌=
tableEnv.fromDataStream(
dataStream,Schema.newBuilder().build());
table.printSchema();
表t=表。选择($(“*”));
DataStream dsRow=tableEnv.toDataStream(t,User.class);
dsRow.print();
execute();
}
}
我得到的错误是:

Exception in thread "main" org.apache.flink.table.api.ValidationException: Column types of query result and sink for registered table 'default_catalog.default_database.Unregistered_DataStream_Sink_1' do not match.
Cause: Incompatible types for sink column 'event_time' at position 2.

Query schema: [name: STRING, score: INT, event_time: RAW('java.time.LocalDateTime', '...'), address: *flinkSqlExperiments.HybridTrial$Address<`street` STRING, `houseNumber` STRING>*]
Sink schema:  [name: STRING, score: INT, event_time: TIMESTAMP(9), address: *flinkSqlExperiments.HybridTrial$Address<`street` STRING, `houseNumber` STRING>*]
    at org.apache.flink.table.planner.connectors.DynamicSinkUtils.createSchemaMismatchException(DynamicSinkUtils.java:437)
    at org.apache.flink.table.planner.connectors.DynamicSinkUtils.validateSchemaAndApplyImplicitCast(DynamicSinkUtils.java:256)
    at org.apache.flink.table.planner.connectors.DynamicSinkUtils.convertSinkToRel(DynamicSinkUtils.java:198)
    at org.apache.flink.table.planner.connectors.DynamicSinkUtils.convertExternalToRel(DynamicSinkUtils.java:143)
线程“main”org.apache.flink.table.api.ValidationException中的异常:已注册表“default_catalog.default_database.Unregistered_DataStream_sink_1”的查询结果和接收器的列类型不匹配。
原因:位置2处接收器列“事件\时间”的类型不兼容。
查询架构:[名称:字符串,分数:INT,事件时间:RAW('java.time.LocalDateTime','…'),地址:*flinkSqlExperiments.HybridTrial$地址*]
接收器模式:[名称:字符串,分数:INT,事件时间:时间戳(9),地址:*flinkSqlExperiments.HybridTrial$address*]
位于org.apache.flink.table.planner.connectors.DynamicSinkUtils.createSchemaMismatcheption(DynamicSinkUtils.java:437)
位于org.apache.flink.table.planner.connectors.DynamicSinkUtils.validateschemandapplyimplicitcast(DynamicSinkUtils.java:256)
位于org.apache.flink.table.planner.connectors.DynamicSinkUtils.convertskinktorel(DynamicSinkUtils.java:198)
位于org.apache.flink.table.planner.connectors.DynamicSinkUtils.convertExternalToRel(DynamicSinkUtils.java:143)

我也尝试了从数据流到表的自定义转换,但从表到数据流的转换仍然出错。我被卡住了,所以非常感谢您的帮助。

DataStream中基于反射的自动类型提取功能没有TableAPI中的功能强大。这也是由于DataStream API中存在向后状态兼容性问题

event\u time
字段是DataStream API中的一个
GenericType
,它导致表API中的
RAW
。您有以下几种可能性:

  • fromElements
  • 使用
    fromDataStream
    中的
    DataType
    覆盖
    TypeInformation