2016-03-01 24 views
0

我有一个具有嵌套字段的GenericRecord。当我使用genericRecord.get(1)时,它返回一个Object,它包含嵌套的AVRO数据。在AVRO中访问嵌套字段GenericRecord(Java/Scala)

我希望能够访问该对象就像genericRecord.get(1).get(0),但我不能因为AVRO返回一个对象。

有没有简单的方法呢?

当我这样做returnedObject.get("item")它说item not a member of returnedObject

+0

我知道我能够做类似访问模式的嵌套类型: 'parsedSchema.getField( “顶层”)schema' 上午然后我能够使用它来解码GenericRecord返回的嵌套对象吗? – rye

回答

1

我想出了一个办法。将退回的Object投射为GenericRecord

例(斯卡拉):

val data_nestedObj = (data.get("nestedObj)).asInstanceOf[GenericRecord]

然后,我可以通过做访问新GenericRecord内嵌套场:

data_nestedObj.get("nestedField")

此作品不够好,我。

+0

对于嵌套数组,您必须转换为'GenericData.Array [GenericRecord]' – rye

3

你可以使用一个Avro的序列化库来帮助你。例如https://github.com/sksamuel/avro4s(我是作者),但也有其他人。

你只需要定义一个案例类你所得到的数据的类型,这可以包括嵌套的case类。例如,

case class Boo(d: Boolean) 
case class Foo(a: String, b: Int, c: Boo) 

然后,您创建RecordFormat类型类的实例。

​​

然后最后,你可以使用它来提取记录或创建记录。

val record = format.to(someFoo) 

val foo = format.from(someRecord) 
+0

我宁愿避免使用另一个库(看起来)很简单。 感谢您发布链接和解释! – rye

+1

如果你想保留下来DEPS那么肯定,但Avro的是有点讨厌在这方面一起工作(许多样板来写,从GenericRecords等:( – monkjack

+0

我完全同意转换......它会是很好,如果他们增加像你正在工作的东西(或其中的一部分)。 – rye