Kafka AVRO Consumer: Десятичный разделитель MySQL в Java

0

Я пытаюсь использовать записи из таблицы MySQL, которая содержит 3 столбца (Axis, Price, lastname) с их типами данных (int, decimal(14,4), varchar(50)) соответственно.

Я вставил одну запись, которая имеет следующие данные (1, 5.0000, John).

Следующий код Java (который использует записи AVRO из темы, созданной коннектором MySQL в платформе Confluent) читает десятичный столбец: Price, как java.nio.HeapByteBuffer, поэтому я не могу достичь значения столбца, когда я получаю Это.

Есть ли способ извлечь или преобразовать полученные данные в десятичный или двойной тип данных Java?

Вот файл свойств MySQL Connector:

{
  "name": "mysql-source",
  "config": {
  "connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
   "key.converter": "io.confluent.connect.avro.AvroConverter",
   "key.converter.schema.registry.url": "http://localhost:8081",
   "value.converter": "io.confluent.connect.avro.AvroConverter",
   "value.converter.schema.registry.url": "http://localhost:8081",
   "incrementing.column.name": "Axis",
   "tasks.max": "1",
   "table.whitelist": "ticket",
   "mode": "incrementing",
   "topic.prefix": "mysql-",
   "name": "mysql-source",
   "validate.non.null": "false",
   "connection.url": "jdbc:mysql://localhost:3306/ticket? 
   user=user&password=password"
   }
}

Вот код: -

    public static void main(String[] args) throws InterruptedException, 
     IOException {

        Properties props = new Properties();

        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ConsumerConfig.GROUP_ID_CONFIG, "group1");


        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, 
        "org.apache.kafka.common.serialization.StringDeserializer");
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, 
        "io.confluent.kafka.serializers.KafkaAvroDeserializer");
        props.put("schema.registry.url", "http://localhost:8081");

        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");

        String topic = "sql-ticket";
final Consumer<String, GenericRecord> consumer = new KafkaConsumer<String, GenericRecord>(props);
consumer.subscribe(Arrays.asList(topic));

try {
  while (true) {
    ConsumerRecords<String, GenericRecord> records = consumer.poll(100);
    for (ConsumerRecord<String, GenericRecord> record : records) {
      System.out.printf("value = %s \n", record.value().get("Price"));
    }
  }
} finally {
  consumer.close();
}

}

Изображение 174551

  • 0
    Ваш потребительский код использует старый, устаревший Consumer API ... Откуда вы взяли этот код?
  • 0
    @cricket_007 cricket_007 Я использую Confluent 4.0.0 и пример Java в этой версии docs.confluent.io/4.0.0/schema-registry/docs/… если я использую последнюю версию, это решит проблему?
Показать ещё 7 комментариев
Теги:
apache-kafka
apache-kafka-connect
confluent

1 ответ

0
Лучший ответ

Хорошо, поэтому я наконец нашел решение.

Heapbytebuffer нужно преобразовать в массив byte[], затем я использовал BigInteger который строит значение из созданного массива байтов, тогда я создал переменную BigDecimal которая принимает значение BigInteger, и я устанавливаю десятичную точку с помощью movePointLeft(4) который является шкалой (в моем случае: 4), и все работало, как ожидалось.

    ByteBuffer buf = (ByteBuffer) record.value().get(("Price"));
    byte[] arr = new byte[buf.remaining()];
    buf.get(arr);
    BigInteger bi =new BigInteger(1,arr);
    BigDecimal bd = new BigDecimal(bi).movePointLeft(4);
    System.out.println(bd);

Вот результаты (слева - выход, Right is MySQL): -

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню