2017-08-02 18 views
0

如何訪問側輸入的元素,如果我有我的課擴展DoFn?訪問方輸入非輕量DoFn

例如:

說我有一個帕爾多變換一樣:

PCollection<String> data = myData.apply("Get data", 
    ParDo.of(new MyClass()).withSideInputs(myDataView)); 

而且我有一個類: -

static class MyClass extends DoFn<String,String> 
{ 
    //How to access side input here 
} 

c.sideInput()不工作這個案例。

謝謝。

+0

你能告訴我你正在收到什麼錯誤嗎?本節展示了一個應該有效的例子。你可以使用示例中所示的一個有害的類來嘗試,然後一旦有效,就嘗試用你的類替換它。兩者都有相同的基類,所以我認爲它應該工作,除非有一些問題重寫某些東西。 https://cloud.google.com/dataflow/model/par-do#passing-side-inputs-to-pardo –

回答

1

在這種情況下,問題是您的DoFn中的processElement方法無法訪問主方法中的PCollectionView實例。

您可以將PCollectionView傳遞給DOFN在構造函數中:

class MyClass extends DoFn<String,String> 
{ 
    private final PCollectionView<..> mySideInput; 

    public MyClass(PCollectionView<..> mySideInput) { 
     // List, or Map or anything: 
     this.mySideInput = mySideInput; 
    } 

    @ProcessElement 
    public void processElement(ProcessContext c) throws IOException 
    { 
     // List or Map or any type you need: 
     List<..> sideInputList = c.sideInput(mySideInput); 
    } 
} 

對此的解釋是,當你使用匿名DOFN,過程方法與進入封閉所有包含DoFn的範圍內的對象(其中包括PCollectionView)。當你不使用匿名DoFn時,沒有關閉,你需要另一種傳遞PCollectionView的方式。

+0

明白了!謝謝@pablo – rish0097