2013-07-25 10 views
5

Ich habe nichts in der Dokumentation darüber gefunden, nur generische bla über Standardwerte. Meine Vermutung war, dass es sollte wie folgt funktionieren:Wie definiere ich einen Standardwert für eine Enumeration mit avro IDL?

enum MyEnum { 
    UNSPECIFIED, 
    SPECIFIED 
} 

record Test { 
    MyEnum e = "UNSPECIFIED"; 
} 

Die GenericDatumReader in Java leider beklagt, dass er einen String findet, erwartet aber eine MyEnum.

Kann jemand bestätigen, dass dies der richtige Weg ist, eine Enum mit einem Standardwert mit avro IDL zu verwenden? In diesem Fall habe ich einen Fehler woanders. Kann mir jemand bestätigen, dass dies nicht der richtige Weg ist, um mich zu korrigieren? Jede Eingabe wird geschätzt!

Update: In meiner realen Version von diesem scheint es, dass eine neu hinzugefügte enum zum Datensatz das Problem verursacht, obwohl es einen Standardwert hat. Das bedeutet, dass mein Leserschema eine Aufzählung erwartet, während der Datensatz keine enthält. Die Schemaevolution sollte das beheben können, scheint aber zu scheitern. Mehr Details: Ich arbeite mit Pig hier, nicht direkt Java.

Antwort

3

Ok, stellt sich heraus, zu konvertieren dies ist in der Tat der richtige Weg um einen Standardwert für eine Enumeration in einer avro IDL anzugeben. In meinem Fall wurde eine Union {null, string} durch eine enum ersetzt, die den ganzen Ärger verursachte. Also denken Sie daran: ändern Sie nicht den Typ eines Feldes in avro!

0

Ich weiß nicht, avro IDL aber wenn Sie sicher sind, ‚Record` Syntax, können Sie diesen Code verwenden, um Ihre String auf Ihre Enum-Typ

MyEnum e = Enum.valueOf(MyEnum.class, "UNSPECIFIED") 
+0

Danke für die Antwort, aber das ist keine Option für mich, da ich von der avro-Schema-Entwicklung abhängig bin (was bei einem neu hinzugefügten Enum gerade fehlzuschlagen scheint). – LiMuBei