2017-08-02 6 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

エラーが表示されますか?このセクションでは、うまくいくはずの例を示します。例に示すようにanymousクラスを使用してこれを試してみてください。そしてそれがクラスに置き換えられたらうまくいきます。どちらも同じ基本クラスを持っているので、何か問題がある場合を除いて、うまくいくはずです。 https://cloud.google.com/dataflow/model/par-do#passing-side-inputs-to-pardo –

答えて

1

この場合、DoFnのprocessElementメソッドは、メインメソッドのPCollectionViewインスタンスにアクセスできないという問題があります。

あなたは、コンストラクタでDoFnにPCollectionViewを渡すことができます。

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

ありがとう@パブロ – rish0097