私は比較的簡単に見えることをしようとしていますが、いくつかの困難に直面しています。
たくさんのテキストがあり、各行は値です。テキストの各行を分析し、適切なキーを作成してから、KV ペアを発行します。次に、GroupByKey
変換を使用します。最後に、キーごとにグループ化されたすべてのテキストを出力したいと思います (キーごとに 1 つのテキスト ファイルを取得できればボーナス ポイントですが、それが可能かどうかはわかりません)。
パイプラインは次のapply
ようになります。
public PCollection<String> apply(PCollection<String> generator) {
// Returns individuals lines of text as <String,String> KV pairs
PCollection<KV<String,String>> generatedTextKV = generator.apply(
ParDo.of(new GeneratorByLineFn()));
// Groups the <String,String> KV pairs by value
PCollection<KV<String, Iterable<String>>> groupedText = generatedTextKV.apply(
GroupByKey.<String, String>create());
// Hopefully returns output where all of each key's values are together
PCollection<String> results = groupedText.apply(ParDo.of(new FormatOutputFn()));
return results;
}
残念ながら、FormatOutputFn()
思い通りに動作させることができません。
各値を反復してIterable<String>
出力しても、キーと値のグループ化は保証されません (これについて間違っている場合は修正してください。そうすれば問題は解決します)。次にStringBuilder()
、小さなデータセットで動作しますが、当然のことながらjava.lang.OutOfMemoryError: Java heap space
、より大きなデータのログにエラーを生成する を使用してみました。変換も試しましたが、K,V ペアの値はではなく、通常Flatten.FlattenIterables
の であるため、どちらも機能しません。PCollection
Iterable
共通キーによる分析に関するこの質問を見てきましたが、答えからすると、自分の状況で何をすべきかが正確にはわかりません。を使用する必要があると思いますが、使用Combine.PerKey
方法が正確にはわかりません。また、これを行うには事前に作成された方法が必要であると想定していますが、ドキュメントでその事前に作成された方法を見つけることができません。私は正しい場所を見ていないだけだと確信しています。
そして、前述のように、テキスト ファイルの名前がキーで、値がすべてファイル内にあるテキスト ファイル出力を取得する方法があれば、それは素晴らしいことです。しかし、Dataflow でこれができるとは思いません (まだ?)。
読んでくれてありがとう。