Как можно преобразовать org.apache.kafka.connect.data.Decimal, хранящийся в файле avro, в тип python?

Я пытаюсь интерпретировать запись Avro, хранящуюся в Debezium в Kafka, используя Python.

           {
              "name": "id",
              "type": {
                "type": "bytes",
                "scale": 0,
                "precision": 64,
                "connect.version": 1,
                "connect.parameters": {
                  "scale": "0"
                },
                "connect.name": "org.apache.kafka.connect.data.Decimal",
                "logicalType": "decimal"
              }
            }

Я не уверен, какому примитивному типу Python 3 это соответствует. Как можно десериализовать это значение?

Заранее спасибо!


person Ravindranath Akila    schedule 23.10.2017    source источник


Ответы (2)


Если вы посмотрите на

https://insight.io/github.com/apache/kafka/blob/trunk/connect/api/src/main/java/org/apache/kafka/connect/data/Decimal.java< /а>

public static byte[] fromLogical(Schema schema, BigDecimal value) {
    if (value.scale() != scale(schema))
        throw new DataException("BigDecimal has mismatching scale value for given Decimal schema");
    return value.unscaledValue().toByteArray();
}

Как видите, он использует BigDecimal, что эквивалентно Decimal в python.

Что такое Python для Java BigDecimal?

Таким образом, вы должны искать Decimal в этом случае.

Часть 2. Десериализация

Что касается десериализации, мне нужна обратная связь, чтобы обновить ответ. Как вы делаете это для других полей на данный момент?

person Tarun Lalwani    schedule 26.10.2017
comment
Как преобразовать org.apache.kafka.connect.data.Decimal в java? Текущее значение выглядит примерно так: FGk= Я хочу преобразовать его в удобочитаемое числовое значение. - person chandramohan; 17.01.2018

org.apache.kafka.connect.data.Decimal — это байтовое представление немасштабированного целого числа в кодировке base64. Чтобы преобразовать это значение в Decimal, вам нужно декодировать строку base64 в байты, получить целое число, а затем масштабировать его на значение parameters.scale.

Эта схема:

{
  "type": "bytes",
  "name": "org.apache.kafka.connect.data.Decimal",
  "version": 1,
  "parameters": {
    "scale": "9",
    "connect.decimal.precision": "38"
  },
  "field": "amount"
}

Можно преобразовать с помощью следующего фрагмента (попробуйте на Pyfiddle< /а>):

ctx = decimal.Context()
ctx.prec = 38  # connect.decimal.precision = 38
result = ctx.create_decimal(
    int.from_bytes(base64.b64decode("GZ6ZFQvYpA=="), byteorder='big')
) / 10 ** 9  # scale = 9
person Bedla    schedule 29.03.2020
comment
Жаль, что я не могу проголосовать за это более одного раза - это актуально и отлично справляется со своей задачей! - person Todor Minakov; 04.12.2020