2017-10-10 6 views
0

ich zwei Ausgänge von einer DoFn Methode haben bin versucht, folgendes Beispiel Apache Beam programming guidePass TupleTag zu DoFn Methode

Grundsätzlich im Beispiel passieren Sie einen TupleTag und dann angeben, wo die Ausgabe zu machen, das funktioniert für mich den Problem ist, dass ich eine externe Methode innerhalb des Pardo nennen, und weiß nicht, wie dieser TupleTag passieren, das ist mein Code:

PCollectionTuple processedData = pubEv 
    .apply("Processing", ParDo.of(new HandleEv()) 
     .withOutputTags(mainData, TupleTagList.of(failedData))); 

HandleEv Methode:

static class HandleEv extends DoFn<String, String> { 
    @ProcessElement 
    public void processElement(ProcessContext c) throws Exception { 
     c.output("test") 
     c.output(failedData,"failed") 
    } 
} 

Der Fehler, den ich bekomme, ist, dass cannot find symbol als failedData nicht von HandleEv zugänglich ist, habe ich versucht, failedData am Anfang der Klasse zu deklarieren, funktioniert aber auch nicht.

Vielen Dank

Antwort

2

Sie diese auf die gleiche Weise tun können Sie einen Wert zu einem anderen Objekt passieren würde - es Pass in als Argument an den Konstruktor HandleEv und speichern sie in einem Feld:

static class HandleEv extends DoFn<String, String> { 
    private final TupleTag<String> failedData; 
    public HandleEv(TupleTag<String> failedData) { 
    this.failedData = failedData; 
    } 

    @ProcessElement 
    public void processElement(ProcessContext c) throws Exception { 
    c.output("test") 
    c.output(failedData,"failed") 
    } 
} 

Und dann ist es wie folgt verwenden:

PCollectionTuple processedData = pubEv 
    .apply("Processing", ParDo.of(new HandleEv(failedData)) 
     .withOutputTags(mainData, TupleTagList.of(failedData))); 
+0

scheint es funktioniert, werde ich die Logik vervollständigt den Seitenausgang zu behandeln, um zu überprüfen, ob ich was zugreifen kann wa s im TupleTag gespeichert und bestätigen die Antwort, danke! – Matias

Verwandte Themen