JDBC Kafka Connect: Поля Oracle NUMBER имеют точность 64, что не удается прочитать из Spark - PullRequest
0 голосов
/ 23 октября 2019

Мы используем Kafka Connect для получения данных из источника данных Oracle и записи в HDFS в формате AVRO. В реестре схем Kafka схема для одного из источников данных выглядит следующим образом:

{
  "type": "record",
  "name": "ConnectDefault",
  "namespace": "io.confluent.connect.avro",
  "fields": [
    {
      "name": "ID",
      "type": [
        "null",
        {
          "type": "bytes",
          "scale": 0,
          "precision": 64,
          "connect.version": 1,
          "connect.parameters": {
            "scale": "0"
          },
          "connect.name": "org.apache.kafka.connect.data.Decimal",
          "logicalType": "decimal"
        }
      ],
      "default": null
    }....
}

Это означает, что столбец идентификатора имеет точность 64. Когда я пытаюсь получить эти файлы AVRO, он выбрасывает:

Вызвано: org.apache.spark.sql.AnalysisException: десятичное число может поддерживать точность только до 38;в org.apache.spark.sql.types.DecimalType. (DecimalType.scala: 51) в org.apache.spark.sql.avro.SchemaConverters $ .toSqlTypeHelper (SchemaConverters.scala: 60) в org.apache.spark.sql.avro.SchemaConverters $ .toSqlTypeHelper (SchemaConverters.scala: 105) в org.apache.spark.sql.avro.SchemaConverters $$ anonfun $ 1.apply (SchemaConverters.scala: 82) в org.apache.spark.sql.avro. SchemaConverters $$ anonfun $ 1.apply (SchemaConverters.scala: 81) на scala.collection.TraversableLike $$ anonfun $ map $ 1.apply (TraversableLike.scala: 234) на scala.collection.TraversableLike $$ anonfun $ map $ 1.apply (TraversableLike.scala: 234) в scala.collection.Iterator $ class.foreach (Iterator.scala: 891) в scala.collection.AbstractIterator.foreach (Iterator.scala: 1334) в scala.collection.IterableLike $ class.foreach (IterableLike.scala: 72) в scala.collection.AbstractIterable.foreach (Iterable.scala: 54) в scala.collection.TraversableLike $ class.map (TraversableLike.scala: 234) в scala.collection.AbstractTraversable.map (Traversable.scala:104) вorg.apache.spark.sql.avro.SchemaConverters $ .toSqlTypeHelper (SchemaConverters.scala: 81) в org.apache.spark.sql.avro.SchemaConverters $ .toSqlType (SchemaConverters.scala: 46) в org.apache.spark. sql.avro.AvroFileFormat.inferSchema (AvroFileFormat.scala: 93) в org.apache.spark.sql.execution.datasources.DataSource $$ anonfun $ 6.apply (DataSource.scala: 180) в org.apache.spark.sql. execute.datasources.DataSource $$ anonfun $ 6.apply (DataSource.scala: 180)

Мой фрагмент кода для чтения файла AVO:

def readSchemaOfAvroPartition(avroLocation: String, partitionColumn: String, partitionValue: String): StructType = {
      sparkSession.read.format(AVRO)
        .load(s"${avroLocation}/${partitionColumn}=${partitionValue}")
        .schema
    }

Согласно Oracle docмаксимальная точность должна быть 38. https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT313

Как заставить Kafka Connect зарегистрировать это значение схемы как 38 вместо 64?

1 Ответ

1 голос
/ 23 октября 2019

Это не обязательно ошибка в коннекторе Kafka, но в целом, как работает Kafka. Во многих базах данных столбец NUMERIC или DECIMAL определяется со значением точности и масштаба. База данных по умолчанию обеспечивает точность и масштаб на основе технологии базы данных.

Соединение Kafka не имеет хорошего способа справиться с этим в базах данных и других файловых системах, отличных от баз данных.

Более подробную информацию можно найти здесь -

https://github.com/confluentinc/kafka-connect-jdbc/issues/563

https://www.confluent.io/blog/kafka-connect-deep-dive-jdbc-source-connector#bytes-decimals-numerics

https://gist.github.com/rmoff/7bb46a0b6d27982a5fb7a103bb7c95b9#file-oracle-md

...