2016-03-01 43 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