1

私はavro4savro シリアライゼーションとデシリアライゼーションを支援するために使用しています。

sを含むケース クラスがあり、レコードを Kafka に公開する前に、Timestampこれらの s を適切にフォーマットされた文字列に変換する必要があります。Timestampデフォルトのエンコーダーは私Timestampの s をLongs に変換しています。デコーダーとエンコーダーを作成する必要があることを読みました ( avro4sreadme から)。

これが私のケースクラスです:

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 classsにエンコードする簡単なソリューションはありますか?TimestampStringcase class

4

1 に答える 1