2013-03-25 11 views
15

Per facilitare il lavoro con Avro in Scala, mi piacerebbe definire una case case basata sullo schema memorizzato con un file .avro. Potrei provare:È possibile ottenere una definizione della classe di case Scala da una definizione di schema Avro?

  1. Scrivere una definizione di classe caso .scala a mano.
  2. livello di programmazione a scrivere stringhe in un file .scala
  3. Spoof la definizione della classe caso con una libreria bytecode come di ObjectWeb ASM
  4. trucchi SpecificCompiler?
  5. Modifica di una definizione di case class esistente in fase di esecuzione?

Grazie, qualsiasi consiglio è apprezzato. -Julian

risposta

14

Ho eseguito l'hacking su un piccolo progetto chiamato Scalavro per passare dall'altra parte (tipi Scala a schemi Avro). Fornisce anche I/O binario diretto.

semplice esempio:

package com.gensler.scalavro.tests 
import com.gensler.scalavro.types.AvroType 

case class Person(name: String, age: Int) 

val personAvroType = AvroType[Person] 
personAvroType.schema 

che produce:

{ 
    "name": "Person", 
    "type": "record", 
    "fields": [ 
    {"name": "name", "type": "string"}, 
    {"name": "age", "type": "int"} 
    ], 
    "namespace": "com.gensler.scalavro.tests" 
} 

ci sono molti altri esempi sul sito del progetto (linkato sopra) e nelle specifiche ScalaTest.

Ho intenzione di ospitare i file binari su Sonatype OSS nel prossimo futuro, ma per ora è possibile estrarre il sorgente da github e sbt publish-local se si desidera provarlo.

Aggiornamento:
Scalavro è ora disponibile su Maven centrale.

+0

Very nice. Mantenere il buon lavoro. Pensi di farcela dove c'è la versione di riflessione in fase di compilazione? –

+0

Non ancora, ma sarebbe un progetto davvero divertente. Vuoi dare una mano? –