All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.landoop.streamreactor.connect.hive.sink.ValueConverter.scala Maven / Gradle / Ivy

The newest version!
package com.landoop.streamreactor.connect.hive.sink

import org.apache.kafka.connect.data.{Schema, SchemaBuilder, Struct}
import org.apache.kafka.connect.sink.SinkRecord

import scala.collection.JavaConverters._

object ValueConverter {
  def apply(record: SinkRecord): Struct = record.value match {
    case struct: Struct => StructValueConverter.convert(struct)
    case map: Map[_, _] => MapValueConverter.convert(map)
    case map: java.util.Map[_, _] => MapValueConverter.convert(map.asScala.toMap)
    case string: String => StringValueConverter.convert(string)
    case other => sys.error(s"Unsupported record $other:${other.getClass.getCanonicalName}")
  }
}

trait ValueConverter[T] {
  def convert(value: T): Struct
}

object StructValueConverter extends ValueConverter[Struct] {
  override def convert(struct: Struct): Struct = struct
}

object MapValueConverter extends ValueConverter[Map[_, _]] {
  override def convert(map: Map[_, _]): Struct = {
    val builder = SchemaBuilder.struct()
    map.foreach {
      case (key, _: String) => builder.field(key.toString, Schema.OPTIONAL_STRING_SCHEMA)
      case (key, _: Long) => builder.field(key.toString, Schema.OPTIONAL_INT64_SCHEMA)
      case (key, _: Int) => builder.field(key.toString, Schema.OPTIONAL_INT64_SCHEMA)
      case (key, _: Boolean) => builder.field(key.toString, Schema.OPTIONAL_BOOLEAN_SCHEMA)
      case (key, _: Float) => builder.field(key.toString, Schema.OPTIONAL_FLOAT64_SCHEMA)
      case (key, _: Double) => builder.field(key.toString, Schema.OPTIONAL_FLOAT64_SCHEMA)
    }
    val schema = builder.build
    val struct = new Struct(schema)
    map.foreach { case (key, value) =>
      struct.put(key.toString, value)
    }
    struct
  }
}

object StringValueConverter extends ValueConverter[String] {
  override def convert(string: String): Struct = {
    val schema = SchemaBuilder.struct().field("a", Schema.OPTIONAL_STRING_SCHEMA).name("struct").build()
    new Struct(schema).put("a", string)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy