我写了一个输出Set的DoFn<String, Set<SectionBodyRecord>>
。
当我执行我的管道时,我得到了异常
Caused by: com.google.cloud.dataflow.sdk.util.IllegalMutationException: DoFn UnmarshalGcsPath mutated value
[SectionBodyRecord{txId='3UR93528NX413902J'},
SectionBodyRecord{txId='15N97640P5806660M'},
SectionBodyRecord{txId='7TG473112Y9407154'},
SectionBodyRecord{txId='9A1906561E887050P'},
SectionBodyRecord{txId='4FP63718R4365381L'}]
after it was output (new value was
[SectionBodyRecord{txId='9A1906561E887050P'},
SectionBodyRecord{txId='7TG473112Y9407154'},
SectionBodyRecord{txId='3UR93528NX413902J'},
SectionBodyRecord{txId='4FP63718R4365381L'},
SectionBodyRecord{txId='15N97640P5806660M'}]).
Values must not be mutated in any way after being output.
at com.google.cloud.dataflow.sdk.transforms.ParDo$ImmutabilityCheckingOutputManager.verifyOutputUnmodified(ParDo.java:1344)
at com.google.cloud.dataflow.sdk.transforms.ParDo$ImmutabilityCheckingOutputManager.output(ParDo.java:1306)
at com.google.cloud.dataflow.sdk.util.DoFnRunnerBase$DoFnContext.outputWindowedValue(DoFnRunnerBase.java:288)
at com.google.cloud.dataflow.sdk.util.DoFnRunnerBase$DoFnProcessContext.output(DoFnRunnerBase.java:450)
at my.tests.pipelines.CsvToDatastore$UnmarshalGcsPath.processElement(CsvToDatastore.java:185)
我不明白问题出在哪里。而且,我试过
ImmutableSet<SectionBodyRecord> irecs = ImmutableSet.copyOf(records);
c.output(irecs);
但问题仍然存在。
有什么建议吗?
提前致谢, 迈克尔
答案 0 :(得分:0)
我猜您在后台使用了HashSet
,而您还没有(重新)为hashCode()
实施SectionBodyRecord
功能 - 至少这是我的问题。
您可以定义hashCode()
int hashCode() { return txId.hashCode(); }
,也可以使用TreeSet
来实现Comparable<SectionBodyRecord>
界面。
您收到错误的原因是每次创建集合时集合中包含的数据都会更改位置,因为没有确定性的方法来确定顺序(在TreeSet
的情况下)或位置(如果HashSet
)您的SectionBodyRecord
元素。