当前位置: 首页 > 知识库问答 >
问题:

Kafka Connect JDBC:Oracle数字字段的精度为64,无法从Spark中读取

何辰沛
2023-03-14
{
  "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
    }....
}

原因:org.apache.spark.sql.analysisException:decimal只能支持高达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 Scala:81)在Scala.collection.traversablelike$$anonfun$map$1.在Scala.collection.traversablelike.scala:234)在Scala.collection.traversablelike$$anonfun$map$1.在Scala.collection.traversablelike.scala:234)在Scala.collection.iterator$class.foreach(iterator.scala:891)在Scala.collection.abstraction.foreach(iterator.scala:1334)在.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.datasource$$AnonFun$6 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文档的最大精度应该是38。https://docs.oracle.com/cd/b28359_01/server.111/b28318/datatype.htm#cncpt313

如何强制Kafka Connect将此模式值注册为38而不是64?

共有1个答案

通啸
2023-03-14

这不一定是Kafka连接器中的bug,但总的来说Kafka是如何工作的。在许多数据库中,数值或十进制列是用精度和小数位数值定义的。基于数据库技术,数据库缺省了精度和规模。

Kafka connect没有很好的方法来处理跨数据库和其他非数据库文件系统的问题。

更多细节可以在这里找到--

 类似资料:
  • 我们正在尝试读取PDF并动态填充其中的值。根据传入的请求,我们运行一些规则,导出要使用的PDF,然后动态地向其填充值。我们使用的是ApachePDFBox版本2.0.11,由于某些原因,我们在使用特定的PDF模板时遇到了问题。我们无法读取此特定模板的某些字段,生成的PDF不完整。想知道是否与原始PDF本身有关。下面是我们用来读取字段并填充字段的代码片段。 当我们试图打印每个字段名时,我们发现超过3

  • 当我们调用时,它会抛出一个异常,说明。我能做什么?

  • 我们已经讨论过,在早期版本的Fortran中,有两种real类型:默认的真实类型和double precision类型。 但是,Fortran 90/95通过kind规范提供了对实数和整数数据类型精度的更多控制。 种类属性 不同种类的数字以不同方式存储在计算机内。 kind属性允许您指定内部存储数字的方式。 例如, real, kind = 2 :: a, b, c real, kind = 4

  • ​https://github.com/camsong/blog/issues/9​

  • 问题内容: 我已经在带有Elasticsearch-Spark连接器的火花壳中进行了一些实验。调用火花: 在scala shell中: 它运作良好,结果包含myquery中指定的良好记录。唯一的事情是,即使我在查询中指定了这些字段的子集,我也获得了所有字段。例: 返回所有字段,不仅返回a和b(顺便说一句,我注意到大小参数都不考虑在内:result包含10条以上的记录)。也许添加字段是嵌套的很重要,

  • 问题内容: 目前,我有一列被声明为NUMBER。我想将列的精度更改为NUMBER(14,2)。 所以,我跑了命令 为此,我遇到了一个错误: 我猜想它在更改精度时希望该列为空,但我不知道为什么要在增加它的同时降低它,所以列中的数据不会丢失。有一个简短的解决方法吗?我不想将其复制到另一个表中,然后再删除它,或者重命名一列并在各列之间进行复制,因为存在传输和删除之间丢失数据的风险。 问题答案: 假设您最