私はavro4s
avro シリアライゼーションとデシリアライゼーションを支援するために使用しています。
sを含むケース クラスがあり、レコードを Kafka に公開する前に、Timestamp
これらの s を適切にフォーマットされた文字列に変換する必要があります。Timestamp
デフォルトのエンコーダーは私Timestamp
の s をLong
s に変換しています。デコーダーとエンコーダーを作成する必要があることを読みました ( avro4s
readme から)。
これが私のケースクラスです:
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)
エンコーダーを使用できません (ブレークポイントにヒットしません)。私は無数のことを試してみて、なぜそれが役に立たないのかを調べました.
暗黙的なオブジェクトを正しくインポートするにはどうすればよいですか?
全体のエンコーダーを作成せずに、 myをcase class
sにエンコードする簡単なソリューションはありますか?Timestamp
String
case class