2017-08-29 5 views
0

ソースがGCSに保存されたテキストファイルであるXMLファイルを作成しようとしています。コードは正常に実行されていますが、単一のXMLファイルではなく、複数のXMLファイルを生成しています。 (XMLファイルの数は、ソーステキストファイルに存在するレコードの総数に従うように見えます)。私はこのシナリオを 'DataflowRunner'の使用中に観察しました。Apache Beamを使用してXMLに書き込む際に複数のファイルが生成される

ローカルで同じコードを実行すると、2つのファイルが生成されます。最初の要素は適切な要素を持つすべてのレコードを含み、2番目の要素は開始と終了のルート要素のみを含みます。

この予期しない動作の発生については、何か考えてください。私が使用しているコードスニペットの下に見つけてください:

PCollection<String>input_records=p.apply(TextIO.read().from("gs://balajee_test/xml_source.txt")); 

    PCollection<XMLFormatter> input_object= input_records.apply(ParDo.of(new DoFn<String,XMLFormatter>(){ 
     @ProcessElement 

     public void processElement(ProcessContext c) 
     { 
      String elements[]=c.element().toString().split(","); 

      c.output(new XMLFormatter(elements[0],elements[1],elements[2],elements[3],elements[4])); 

      System.out.println("Values to be written have been provided to constructor "); 

     } 
    })).setCoder(AvroCoder.of(XMLFormatter.class)); 

    input_object.apply(XmlIO.<XMLFormatter>write() 
       .withRecordClass(XMLFormatter.class) 
       .withRootElement("library") 
       .to("gs://balajee_test/book_output")); 

私は出力で単一のXMLファイル(book_output.xml)を生成する方法を教えてください。次のように

答えて

0

XmlIO.write().to()が文書化されている:

/** 
* Writes to files with the given path prefix. 
* 
* <p>Output files will have the name {@literal {filenamePrefix}-0000i-of-0000n.xml} where n is 
* the number of output bundles. 
*/ 

すなわち複数のファイルを生成する可能性があります。ランナーが3つのタスク(「バンドル」)にデータを並列化して処理することを選択すると、3つのファイルが取得されます。場合によっては一部の部品が空になることがありますが、書き込まれたデータの合計は常に予想されるデータに加算されます。

あなたのデータがそれほど大きくない場合、IOに1つのファイルを生成するように頼むのは妥当な要求です。これはTextIOとAvroIOで.withoutSharding()経由でサポートされていますが、XmlIOではまだサポートされていません。機能リクエストでfile a JIRAまでお気軽にお問い合わせください。

+0

https://issues.apache.org/jira/browse/BEAM-2826 –

+0

同じJIRAリクエストが提出されました。 –

関連する問題