Apache flink Flink中是否不推荐使用JSONDeserializationSchema()?

Apache flink Flink中是否不推荐使用JSONDeserializationSchema()?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我是Flink的新手,正在做一些与下面链接非常相似的事情 我还尝试添加JSONDeserializationSchema()作为Kafka输入JSON消息的反序列化程序,该消息没有键 但我发现JSONDeserializationSchema()不存在 如果我做错了什么,请告诉我 JSONDeserializationSchema在之前被弃用后,在Flink 1.8中被删除 推荐的方法是编写一个反序列化程序,实现反序列化模式。下面是一个例子,我从 import org.apache.flink

我是Flink的新手,正在做一些与下面链接非常相似的事情

我还尝试添加JSONDeserializationSchema()作为Kafka输入JSON消息的反序列化程序,该消息没有键

但我发现JSONDeserializationSchema()不存在

如果我做错了什么,请告诉我


JSONDeserializationSchema
在之前被弃用后,在Flink 1.8中被删除

推荐的方法是编写一个反序列化程序,实现
反序列化模式
。下面是一个例子,我从

import org.apache.flink.api.common.serialization.DeserializationSchema;
导入org.apache.flink.api.common.typeinfo.TypeInformation;
导入org.apache.flink.shade.jackson2.com.fasterxml.jackson.databind.ObjectMapper;
导入java.io.IOException;
/**
*用于从JSON反序列化{@link ClickEvent}的Kafka{@link反序列化模式}。
*
*/
公共类ClickEventDeserializationSchema实现反序列化架构{
私有静态最终长serialVersionUID=1L;
私有静态最终ObjectMapper ObjectMapper=新ObjectMapper();
@凌驾
public ClickEvent反序列化(字节[]消息)引发IOException{
返回objectMapper.readValue(消息,ClickEvent.class);
}
@凌驾
公共布尔值isEndOfStream(单击事件下一个事件){
返回false;
}
@凌驾
公共类型信息getProducedType(){
返回TypeInformation.of(ClickEvent.class);
}
}

对于卡夫卡制作人,您需要实现
KafkaSerializationSchema
,您可以在同一个项目中找到这方面的示例。

解决从卡夫卡I用例类和JSON解析器读取非关键JSON消息的问题

下面的代码生成一个case类,并使用playapi解析JSON字段

import play.api.libs.json.JsValue

object CustomerModel {

  def readElement(jsonElement: JsValue): Customer = {
    val id = (jsonElement \ "id").get.toString().toInt
    val name = (jsonElement \ "name").get.toString()
    Customer(id,name)
  }
case class Customer(id: Int, name: String)
}

def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
val properties = new Properties()
properties.setProperty("bootstrap.servers", "xxx.xxx.0.114:9092")
properties.setProperty("group.id", "test-grp")

val consumer = new FlinkKafkaConsumer[String]("customer", new SimpleStringSchema(), properties)
val stream1 = env.addSource(consumer).rebalance

val stream2:DataStream[Customer]= stream1.map( str =>{Try(CustomerModel.readElement(Json.parse(str))).getOrElse(Customer(0,Try(CustomerModel.readElement(Json.parse(str))).toString))
    })

stream2.print("stream2")
env.execute("This is Kafka+Flink")

}
Try方法允许您克服解析数据时引发的异常 并返回其中一个字段中的异常(如果需要),否则它可以返回带有任何给定或默认字段的case类对象

代码的示例输出为:

stream2:1> Customer(1,"Thanh")
stream2:1> Customer(5,"Huy")
stream2:3> Customer(0,Failure(com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
 at [Source: ; line: 1, column: 0]))

我不确定这是否是最好的方法,但到目前为止它对我有效。

在Flink中没有
JSONDeserializationSchema
这样的东西。有一个JSONKeyValueDeserializationSchema,你的意思是吗?通过这个stackoverflow,我试图使用JSONKeyValueDeserializationSchema不起作用的非键json消息。另外,GitHub上的代码似乎在使用JSONDeserializationSchema啊,是的,对不起,我的错误。我在看Flink 1.8,但正如@David在下面提到的,它已经从这个版本中删除了。没问题@Dominikowsiński:)谢谢David,我更新了我的答案,加入了一个例子。这种方法应该有更好的性能,并与卡夫卡消费者更干净地集成。谢谢你,伙计!!这对我非常有帮助,解决了一个我苦苦挣扎了几个小时的问题。干杯