【问题标题】:Decode Avro decimal-as-bytearray string解码 Avro 十进制字节数组字符串
【发布时间】:2019-04-24 13:28:33
【问题描述】:

我正在使用带有 Avro 消息的 Kafka。我的一个字段是这样定义的:

{ 
    "name": "a_number", 
    "type": "bytes", 
    "logicalType": "decimal", 
    "precision": 4, 
    "scale": 4 
}

使用 Avro 控制台使用者,我看到如下消息:

{"a_number": "\t\u0000°"}

我希望等于59

据说是字节数组should be the twos-compliment of the number。我尝试使用 Python 的 struct 模块对其进行解码,但我得到的值没有任何意义:

bs = '\t\u0000°'.encode('utf8')    # b'\t\x00\xc2\xb0'
struct.unpack('>l', bs)[0] / 1e4   # 15104.4784

如何验证消息?我可以以某种方式解码字符串,还是 Avro 控制台消费者损坏了它?

【问题讨论】:

  • 比较:struct.pack('>l', int(59 * 1e4)) == b'\x00\t\x00\xb0'
  • 您确定要将高位 ASCII 值编码为 UTF-8 吗?然后,它们将获得至少一个额外的字节,这将影响总值。也就是说,至少你会得到 4 个字节。您的示例字符串仅定义 3.
  • @usr2564301 是的,我不确定——看起来确实很奇怪。我选择 UTF-8 的原因是 JSON 使用它来编码字符串,而 Avro 控制台使用者的输出(显然)是 JSON。我对那个字符串有点怀疑;我本来希望它会用 Base64 左右写一些东西。

标签: python python-3.x apache-kafka avro


【解决方案1】:

你似乎正在努力解决这个问题。 How to extract schema for avro file in python 建议的方法是使用:

reader = avro.datafile.DataFileReader(open('filename.avro',"rb"),avro.io.DatumReader())
schema = reader.meta

在调试器中单步执行以查看阅读器如何解码您的消息应该让您更接近于组装“原始”手工设计的解码器。

【讨论】:

  • 是的,公平点。我没有要读取的.avro 文件,但也许我应该使用AvroConsumer 而不是(可能)基于Java 的控制台使用者编写一个小Python 脚本来测试它。
猜你喜欢
  • 2011-10-02
  • 2020-11-11
  • 2020-03-04
  • 2013-08-09
  • 2013-10-13
  • 2015-07-13
  • 1970-01-01
  • 2018-08-21
相关资源
最近更新 更多