Java 如何使用Spark结构化流实现Kafka流的自定义反序列化器?
我正在尝试将我当前的流媒体应用程序迁移到使用结构化流媒体的新数据集API,这是基于使用RDDs(from)的流媒体应用程序,我被告知这是目前使用Spark进行实时流媒体的首选方法 目前,我有一个名为“SATELLITE”的应用程序设置,它包含包含关键时间戳的消息和包含Java 如何使用Spark结构化流实现Kafka流的自定义反序列化器?,java,apache-spark,apache-kafka,apache-spark-sql,spark-structured-streaming,Java,Apache Spark,Apache Kafka,Apache Spark Sql,Spark Structured Streaming,我正在尝试将我当前的流媒体应用程序迁移到使用结构化流媒体的新数据集API,这是基于使用RDDs(from)的流媒体应用程序,我被告知这是目前使用Spark进行实时流媒体的首选方法 目前,我有一个名为“SATELLITE”的应用程序设置,它包含包含关键时间戳的消息和包含SATELLITEPOJO的值。但是我在弄清楚如何实现反序列化程序时遇到了问题。在我当前的应用程序中,很简单,你只需在你喜欢的kafka属性映射中添加一行(value.deserializer,SatelliteMessageDes
SATELLITE
POJO的值。但是我在弄清楚如何实现反序列化程序时遇到了问题。在我当前的应用程序中,很简单,你只需在你喜欢的kafka属性映射中添加一行(value.deserializer,SatelliteMessageDeserializer.class)代码>
我是用Java来做这件事的,这是最大的挑战,因为所有的解决方案似乎都是用Scala来做的,我对Scala不太了解,也不容易将Scala代码转换成Java代码
我遵循了中概述的JSON示例,该示例目前有效,但对于我需要做的事情来说似乎过于复杂。考虑到我已经为此制作了自定义反序列化程序,我不明白为什么我必须首先将其转换为字符串,只是将其转换为JSON,然后将其转换为所需的类类型。我也一直在尝试使用我找到的一些例子,但到目前为止我没有运气
目前我的应用程序如下(使用json方法):
来自_json的
只能用于字符串类型的列
值总是使用ByteArraydSerializer反序列化为字节数组。使用DataFrame操作显式反序列化值
因此,您至少应该首先反序列化到一个字符串,但我认为您并不需要这样做
也许可以这样做
df.select(value).as(Encoders.bean(Satellite.class))
如果这不起作用,您可以尝试定义自己的UDF/解码器,这样您就可以拥有类似SATELLITE\u DECODE(value)
在斯卡拉
object SatelliteDeserializerWrapper {
val deser = new SatelliteDeserializer
}
spark.udf.register("SATELLITE_DECODE", (topic: String, bytes: Array[Byte]) =>
SatelliteDeserializerWrapper.deser.deserialize(topic, bytes)
)
df.selectExpr("""SATELLITE_DECODE("topic1", value) AS message""")
请参阅,并且还提到了来自_json的,它只能用于字符串类型的列
值总是使用ByteArraydSerializer反序列化为字节数组。使用DataFrame操作显式反序列化值
因此,您至少应该首先反序列化到一个字符串,但我认为您并不需要这样做
也许可以这样做
df.select(value).as(Encoders.bean(Satellite.class))
如果这不起作用,您可以尝试定义自己的UDF/解码器,这样您就可以拥有类似SATELLITE\u DECODE(value)
在斯卡拉
object SatelliteDeserializerWrapper {
val deser = new SatelliteDeserializer
}
spark.udf.register("SATELLITE_DECODE", (topic: String, bytes: Array[Byte]) =>
SatelliteDeserializerWrapper.deser.deserialize(topic, bytes)
)
df.selectExpr("""SATELLITE_DECODE("topic1", value) AS message""")
请参阅,并提到我尝试了两种方法,但都不奏效。你能看一下我的编辑吗?我在这里展示了我是如何实现一个UDF的。我需要它返回卫星类型
,但它似乎只允许我从数据类型
类返回类型。我不知道该怎么解决这个问题。目前,它在JavaAPI中抛出了一个ClassCastException
,我认为您需要创建自己的结构类型。我尝试了这两种方法,但都没有成功。你能看一下我的编辑吗?我在这里展示了我是如何实现一个UDF的。我需要它返回卫星类型
,但它似乎只允许我从数据类型
类返回类型。我不知道该怎么解决这个问题。目前,它在JavaAPI中抛出了一个ClassCastException
,我认为您需要创建自己的结构类型
object SatelliteDeserializerWrapper {
val deser = new SatelliteDeserializer
}
spark.udf.register("SATELLITE_DECODE", (topic: String, bytes: Array[Byte]) =>
SatelliteDeserializerWrapper.deser.deserialize(topic, bytes)
)
df.selectExpr("""SATELLITE_DECODE("topic1", value) AS message""")