我正在尝试做一些看起来相对简单但遇到一些困难的事情。
我有一堆文本,每一行都是一个值。我分析每一行文本,创建适当的密钥,然后发出 KV 对。然后我使用GroupByKey
变换。最后,我想输出现在按键分组的所有文本(如果我可以为每个键获取一个文本文件,则加分,但我不确定这是否可能)。
这是管道的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
在较大数据的日志中生成错误。我也尝试了Flatten.FlattenIterables
转换,但这也不起作用,因为 K,V 对中的值不是 a PCollection
,而只是一个常规Iterable
。
我已经看过这个关于通过 common key 分析的问题,但是从答案来看,我并不完全清楚我应该如何处理我的情况。我想我必须使用Combine.PerKey
,但我不确定如何使用它。我还假设必须有一种预烘焙的方式来做到这一点,但我在文档中找不到这种预烘焙的方式。我确定我只是没有找对地方。
而且,如上所述,如果有一种方法可以获取文本文件输出,其中文本文件的名称是键并且值都在文件中,那将是惊人的。但我不认为 Dataflow 可以做到这一点(还没有?)。
感谢您的阅读。