2016-11-14 3 views
1

Setを出力するDoFn<String, Set<SectionBodyRecord>>を書きました。 私は私のパイプラインを実行すると、私は、問題が可能性がどこ私は理解していない例外DoFnのcom.google.cloud.dataflow.sdk.util.IllegalMutationException

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

UnmarshalGcsPathのコードが表示されていないとわかりにくいです。あなたはそれを投稿できますか? – jkff

+0

どんな種類の 'Set'表現が使われていますか? 'Set'と' SectionBodyRecord'の両方に対してどのように等式が定義されていますか?このエラーに基づいて、セットは等価であると見なされますが、それらのセットは同じであるとみなされます。 'SectionBodyRecord'sは、' txId'値が等しい場合、等しく扱われますか? –

答えて

0

は、私はあなたがバックグラウンドでHashSetを使用推測、あなたがいない(再)SectionBodyRecordためhashCode()機能を実装している - 少なくとも、私の問題だったという。

int hashCode() { return txId.hashCode(); }のように定義するか、代わりにTreeSetを使用してComparable<SectionBodyRecord>インターフェイスを実装することができます。

エラーが発生する理由は、セットを作成するたびに、セットに含まれるデータの位置が変わるということです。順序を確定する決定的な方法がないため(TreeSetの場合)、位置SectionBodyRecordの要素のHashSet

関連する問題