在Spark结构化流中反序列化Kafka Avro主题时,无效的int编码

时间:2019-04-30 05:21:00

标签: apache-spark apache-spark-sql byte spark-structured-streaming

我正尝试使用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的某种编码和解码格式错误。

2 个答案:

答案 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。

那是我的解决办法。

希望可以帮助您