2017-09-08 1 views
0

ein Modell wie folgt Angenommen:Wie kann ich eine Scala-Eigenschaft in Avro darstellen?

trait PayloadKind 
trait Command extends PayloadKind 
trait Event extends PayloadKind 

trait Message[T <: PayloadKind] { 
    val id: String 
    val payload: T 
} 

case class Alarm(severity: Int) extends Event 

case class AlarmMessage(id: String, payload: Alarm) extends Message[Event] 

I [PayloadKind] Objekte Nachricht in der Lage sein möchten, senden/empfangen und haben Avro das Richtige zu tun. (Im Moment ist es völlig verblüfft!)

Wie sieht das Avro-Schema für so etwas aus? Ich bin so weit gekommen:

PayloadKind (und Event/Command) sind Marker. Wie kann ich sie in Avro Schema darstellen?

Antwort

0

diese von Ihnen genannten Typen für die Aufzeichnung und einer Union, benötigen Modell zu verwenden:

kann

Avro dann herauszufinden, welche Art Rekord innerhalb der Union nach Name ist. Der Name dient als Diskriminator für die Unterklasse.

{ 
    "type":"record","name":"Message","namespace":"com.tryme","fields":[ 
    {"name":"id","type":"string"}, 
    {"name":"payload","type":[ 
     { 
     "type":"record","name":"Event","fields":[] 
     }, 
     { 
     "type":"record","name":"Command","fields":[] 
     } 
     ] 
    } 
    ] 
} 
+0

Wie viele Stufen kann ich in Avro nehmen? Im Idealfall möchte ich, dass ein Wrapper um Event & Command PayloadKind ist, und dann konkrete Unterklassen unter Event & Command, z. AlarmEvent, FooCommand usw. Können diese in der aktuellen Schemaspezifikation dargestellt werden? (PayloadKind, Event und Command können selbst Felder haben - möglicherweise Marker-Merkmale) – Greg

+0

Es gibt keine Grenzen für die Verschachtelung von Avro, aber der Zugriff wäre weniger einfach, wenn Sie AlarmEvent und OtherEvent in ein Nest verschachteln Event, da sie dann ein Feld innerhalb der "Event" -Einträge sein werden. Der Einfachheit halber würde ich vorschlagen, alle Unterklassen direkt zu verschachteln und die Zwischentypen Event und Command zu ignorieren. Diese sind in Bezug auf die "Form" der Daten bedeutungslos, so dass sie im Avro-Schema nicht wichtig sind. Sie müssen keine 1-zu-1-Zuordnung in Ihrem Schema haben, vorausgesetzt Ihre Deserialisierung übernimmt die Zuordnung des Datensatznamens zum richtigen Typ. –

Verwandte Themen