[英]Flink using multiple structures of data in java
提示:本站为国内最大中英文翻译问答网站,提供中英文对照查看,鼠标放在中文字句上可显示英文原文。
我正在从 Java 中的 kafka 读取数据,以在 Apache Flink 中执行一些处理并接收结果。
我有 kafka 主题topic_a ,其中有一些数据,例如 {name: "abc", age: 20} 和一些数据,例如 {pin: 111, number: 999999, address: "some place"}
当我使用 KafkaSource 从 kafka 读取数据时,我将记录反序列化为一个 POJO,它具有字段 String name、int age 以及它们各自的 getter 和 setter 函数以及构造函数。
当我运行 flink 代码时,deserliazer 可以正常工作 {name: "abc", age: 20}
KafkaSource<AllDataPOJO> kafkaAllAlertsSource = KafkaSource.<AllAlertsPOJO>builder()
.setBootstrapServers(bootstrapServers)
.setTopics(Arrays.asList("topic_a"))
.setProperties(properties)
.setGroupId(allEventsGroupID)
.setStartingOffsets(OffsetsInitializer.earliest())
.setValueOnlyDeserializer(new AllDataDeserializationSchema())
.build();
AllDataPOJO
private String name;
private int age;
该代码在{name: "abc", age: 20}上运行良好,但一旦{pin: 111, number: 999999, address: "some place"} ,它就开始失败。
2个问题:
我怎样才能用 1 个 flink java 代码实现上述目标?
您可能有兴趣将反序列化架构指定为:
.setDeserializer(KafkaRecordDeserializationSchema.of(new JSONKeyValueDeserializationSchema(false)))
然后您将使用 map 过滤该源,验证存在哪些字段:
Key fields can be accessed by calling objectNode.get("key").get(<name>).as(<type>)
Value fields can be accessed by calling objectNode.get("value").get(<name>).as(<type>)
或者将对象转换为 map 中现有的 POJO。
如果您有其他带有其他字段的 POJO 类,则不能使用<AllDataPOJO>
。
或者,您需要添加来自所有 POJO 类型的所有字段,并在它们不存在于您的数据中时使它们可为空。 但这可能容易出错,因为 name 和 pin 可能存在于同一条记录中,例如,但不应该。
否则,正如另一个答案所说,使用更通用的 String/JSON 反序列化器,然后您可以使用过滤器/映射操作将数据转换为更具体的类型,具体取决于可用的字段
在这种情况下,我通常使用 SimpleStringSchema,然后使用 ProcessFunction 来解析字符串,并使用辅助输出(每种消息类型一个)。 这种方法的额外好处是,如果 JSON 不可反序列化,或者它不能正确地 map 到任何目标类型,您就有机会灵活地处理错误(例如发送到错误接收器)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.