Мы используем 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?