讓我們來創建一個簡單的類。使用AvroCoder序列化提供的模式的泛型類
class IntValue {
private int data;
IntValue() {}
IntValue(int data) { this.setData(data); }
int getData() { return this.data; }
void setData(int data) { this.data = data; }
}
和薄通用包裝:
class Snapshot<T> {
private T value;
Snapshot<T>() {}
T getValue() { return value; }
void setValue(T value) { this.value = value; }
}
接下來讓我們做一個幫手來獲得包裝的架構。
private static Schema buildSnapshotSchema(Schema valueSchema) {
return SchemaBuilder.record("Snapshot")
.namespace("com.stackoverflow.primer")
.fields()
.name("value").type(valueSchema).noDefault()
.endRecord();
}
最後,我想以同樣的方式與明確的模式創建AvroCoder因爲它是在Using Avrocoder for Custom Types with Generics
AvroCoder.of(Snapshot.class, buildSnapshotSchema(AvroCoder.of(IntValue.class).getSchema())
結果產生...
Exception in thread "main" java.lang.IllegalArgumentException: Unable to get field data from class null
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.getField(AvroCoder.java:710)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.checkRecord(AvroCoder.java:548)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.doCheck(AvroCoder.java:477)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.recurse(AvroCoder.java:453)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.checkRecord(AvroCoder.java:567)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.doCheck(AvroCoder.java:477)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.recurse(AvroCoder.java:453)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.check(AvroCoder.java:430)
at com.google.cloud.dataflow.sdk.coders.AvroCoder.<init>(AvroCoder.java:189)
at com.google.cloud.dataflow.sdk.coders.AvroCoder.of(AvroCoder.java:144)
at com.stackoverflow.primer.GenericPipeline.main(GenericPipeline.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
它發生在AvroDeterminismChecker中,當它無法從Object的實例獲取字段「數據」時。這是有道理的,但爲什麼它不使用提供的模式來重建對象?在這種情況下如何創建AvroCoder的實例?
UPDATE
找到另一篇文章中有類似的問題,但它看起來就像是無法得到解決...... Dataflow output parameterized type to avro file
你可以請發佈完整的堆棧跟蹤,而不是隻有錯誤消息? – jkff
@jkff只是FYI SDK的版本是1.9.0 – Eugene
@jkff我已經用完整的堆棧跟蹤更新了這篇文章,能否再次檢查一下? – Eugene