2016-12-06 66 views
0

我正在和Avro合作,我有一個GenericRecord。我想提取dataTimestamp,processTimestamp,clientId,processIddeviceIdgoldenHeader的值。如何從Avro的RECORD類型獲取輸入值?

"fields" : [ { 
    "name" : "goldenHeader", 
    "type" : { 
     "type" : "record", 
     "name" : "GoldenHeader", 
     "fields" : [ { 
     "name" : "dataTimestamp", 
     "type" : "long" 
     }, { 
     "name" : "processTimestamp", 
     "type" : "long" 
     }, { 
     "name" : "clientId", 
     "type" : "int" 
     }, { 
     "name" : "processId", 
     "type" : [ "null", { 
      "type" : "string", 
      "avro.java.string" : "String" 
     } ] 
     }, { 
     "name" : "deviceId", 
     "type" : { 
      "type" : "string", 
      "avro.java.string" : "String" 
     } 
     } ] 
    }, 
    "doc" : "Golden header" 
    }, 
    .. some other fields 
    ] 

GenericRecord看起來是這樣的,當我們得到的數據:

{"goldenHeader": {"dataTimestamp": 1481055083500, "processTimestamp": 1481055085524, "clientId": 1234, "processId": null, "deviceId": "ducer"}} 

現在我搞不清我怎麼可以提取單個字段從goldenHeader這是一個RECORD類型。當我爲goldenHeader打印出來的類名我看到這一點:

org.apache.avro.generic.GenericData.Record 

下面是我已經拿到了代碼,但我搞不清什麼做下一個:

public static Object fromAvro(Object obj, Schema schema) { 
    if (obj == null) { 
     return null; 
    } 
    System.out.println(schema.getType()); 
    switch (schema.getType()) { 
     case RECORD: 
     // not sure what to do here 
    } 
    } 

什麼是做的最好的方法這個?

回答

0

如果你的對象實際上有這些字段,它的運行時類是一些子類,你只需要找出它實際上是什麼類。在我看來最簡單的方法是instanceof

public static Object fromAvro(Object obj) { 
    if (obj == null) { 
    return null; 
    } 

    if(obj instanceof MyClass) { 
    MyClass myClass = (MyClass)obj; 
    GoldenHeader goldenHeader = myClass.getGoldenHeader(); 
    // ... 
    } 
} 
+0

那麼我沒有任何pojo的東西在這裏。所以我需要以某種方式手動提取它。 – john

+0

你的意思是當你做'obj.getClass()'它返回'java.lang.Object'嗎?然後我不確定你是否真的將數據傳遞給Java。 – Adam