我正尝试使用Spark结构化流(版本2.3.1)处理来自kafka的流式avro数据,因此我尝试使用this示例进行反序列化。
仅在主题value
部分包含StringType
的情况下有效,但在我的情况下,模式包含long and integers
如下:
public static final String USER_SCHEMA = "{"
+ "\"type\":\"record\","
+ "\"name\":\"variables\","
+ "\"fields\":["
+ " { \"name\":\"time\", \"type\":\"long\" },"
+ " { \"name\":\"thnigId\", \"type\":\"string\" },"
+ " { \"name\":\"controller\", \"type\":\"int\" },"
+ " { \"name\":\"module\", \"type\":\"int\" }"
+ "]}";
因此它在
处给出了例外sparkSession.udf().register("deserialize", (byte[] data) -> {
GenericRecord record = recordInjection.invert(data).get(); //throws error at invert method.
return RowFactory.create(record.get("time"), record.get("thingId").toString(), record.get("controller"), record.get("module"));
}, DataTypes.createStructType(type.fields()));
说
Failed to invert: [B@22a45e7
Caused by java.io.IOException: Invalid int encoding.
因为我在架构time, controller and module
类型中有long and int
。
我想这是字节数组byte[] data
的某种编码和解码格式错误。
答案 0 :(得分:1)
您是否看过此https://issues.apache.org/jira/browse/AVRO-1650。它专门讨论您可能遇到的问题。默认的UTF-8编码会导致在编码/解码过程中丢失。
我还建议您是否要处理二进制编码的数据,以使用Base64编码来保存/传输数据,因为它利用了ISO-8859-1,这是上述每个链接正确编码的用法。 / p>
答案 1 :(得分:-1)
我也遇到这种情况,我想也许您将kafka值反序列化器配置为默认的字符串反序列化器,您可以尝试将反序列化器更改为org.apache.kafka.common.serialization.ByteArrayDeserializer。
那是我的解决办法。
希望可以帮助您