繁体   English   中英

Flink在java中使用多种数据结构

[英]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 操作。 根据收到的消息类型,我希望将其路由到不同的 kafka 主题。?
  2. 当我得到{name: "abc", age: 20}时,它应该是 go 主题user_basic{pin: 111, number: 999999, address: "some place"}应该是 go 主题 ** user_details**

我怎样才能用 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.

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