Я использую avro4s
, чтобы помочь с сериализацией и десериализацией avro.
У меня есть класс case, который включает Timestamp
s, и мне нужно, чтобы эти Timestamp
s были преобразованы в красиво отформатированные строки, прежде чем я publi sh записи в Кафку; кодировщик по умолчанию преобразует мои Timestamp
s в Long
s. Я прочитал, что мне нужно написать декодер и кодировщик (из avro4s
readme).
Вот мой класс case:
case class MembershipRecordEvent(id: String,
userHandle: String,
planId: String,
teamId: Option[String] = None,
note: Option[String] = None,
startDate: Timestamp,
endDate: Option[Timestamp] = None,
eventName: Option[String] = None,
eventDate: Timestamp)
Я написал следующий кодировщик:
Test.scala
def test() = {
implicit object MembershipRecordEventEncoder extends Encoder[MembershipRecordEvent] {
override def encode(t: MembershipRecordEvent, schema: Schema) = {
val dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
val record = new GenericData.Record(schema)
record.put("id", t.id)
record.put("userHandle", t.userHandle)
record.put("teamId", t.teamId.orNull)
record.put("note", t.note.orNull)
record.put("startDate", dateFormat.format(t.startDate))
record.put("endDate", if(t.endDate.isDefined) dateFormat.format(t.endDate.get) else null)
record.put("eventName", t.eventName.orNull)
record.put("eventDate", dateFormat.format(t.eventDate))
record
}
}
val recordInAvro2 = Encoder[MembershipRecordEvent].encode(testRecord, AvroSchema[MembershipRecordEvent]).asInstanceOf[GenericRecord]
println(recordInAvro2)
}
Если я объявлю свой implicit object
в строке, как я сделал выше, он создаст GenericRecord
, который я ищу, очень хорошо. Я попытался абстрагировать implicit object
в файл, завернутый в объект, и я import Implicits._
, чтобы использовать свой собственный кодировщик.
Implicits.scala
object Implicits {
implicit object MembershipRecordEventEncoder extends Encoder[MembershipRecordEvent] {
override def encode(t: MembershipRecordEvent, schema: Schema) = {
val dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
val record = new GenericData.Record(schema)
record.put("id", t.id)
record.put("userHandle", t.userHandle)
record.put("teamId", t.teamId.orNull)
record.put("note", t.note.orNull)
record.put("startDate", dateFormat.format(t.startDate))
record.put("endDate", if(t.endDate.isDefined) dateFormat.format(t.endDate.get) else null)
record.put("eventName", t.eventName.orNull)
record.put("eventDate", dateFormat.format(t.eventDate))
record
}
}
}
Test.scala
import Implicits._
val recordInAvro2 = Encoder[MembershipRecordEvent].encode(testRecord, AvroSchema[MembershipRecordEvent]).asInstanceOf[GenericRecord]
println(recordInAvro2)
Он не может использовать мой кодировщик (не попадает в мои точки останова). Я перепробовал множество вещей, чтобы понять, почему это не помогло.
Как я могу правильно импортировать неявный объект?
Есть ли более простое решение для кодирования моего case class
от Timestamp
s до String
s без записи кодировщика для всего case class
?