Java 使用CombineFn累积来自所有节点的数据后,组合每个键的所有值
我想在perKey的基础上迭代KV pCollection的值。我使用下面的代码使用自定义类进行组合Java 使用CombineFn累积来自所有节点的数据后,组合每个键的所有值,java,google-cloud-dataflow,Java,Google Cloud Dataflow,我想在perKey的基础上迭代KV pCollection的值。我使用下面的代码使用自定义类进行组合 PCollection<KV<String, String>> combinesAttributes = valExtract.get(extAttUsers).apply(Combine.<String, String>perKey( new CombineAttributes()));
PCollection<KV<String, String>> combinesAttributes =
valExtract.get(extAttUsers).apply(Combine.<String, String>perKey(
new CombineAttributes()));
PCollection组合属性=
获取(extAttUsers).apply(Combine.perKey(
新组合属性());
下面是我的自定义联合收割机类
public static class CombineAttributes implements SerializableFunction<Iterable<String>, String> {
@Override
public String apply(Iterable<String> input) {...}..}
公共静态类CombineAttributes实现SerializableFunction{
@凌驾
公共字符串应用(Iterable输入){…}..}
这对于小输入来说效果很好,但对于大输入来说,联合收割机并没有达到预期效果。输出仅为一个键组合了几个值,其他值丢失。我假设输出只合并了来自一个节点的数据
中的文档提到要使用CombineFn来组合所有节点中每个键的完整值集合
但是,当我更改如下自定义联合收割机功能时,我得到以下错误:
incompatible types: CombineAttributes cannot be converted to com.google.cloud.dataflow.sdk.transforms.SerializableFunction<java.lang.Iterable<java.lang.String>,java.lang.String>
不兼容类型:CombineAttributes无法转换为com.google.cloud.dataflow.sdk.transforms.SerializableFunction
组合功能
public static class CombineAttributes extends CombineFn<Iterable<String>, CombineAttributes.Accum, String> {
public static class Accum {
List<String> inputList = new ArrayList<String>();
}
public Accum createAccumulator() { return new Accum(); }
public Accum addInput(Accum accum, Iterable<String> input) {
for (String item : input) {
accum.inputList.add(item);
}
return accum;
}
public Accum mergeAccumulators(Iterable<Accum> accums) {
Accum merged = createAccumulator();
for (Accum accum : accums) {
for (String item : accum.inputList) {
merged.inputList.add(item);
}
}
return merged;
}
public String extractOutput(Accum accum) {
return "";
}
}
公共静态类CombineAttributes扩展CombineAfn{
公共静态类累加器{
List inputList=新建ArrayList();
}
公共Accum CreateCummerator(){返回新Accum();}
公共累加输入(累加、可输入){
for(字符串项:输入){
累计输入清单新增(项);
}
返回累计;
}
公共累加器(可累加){
Accum merged=createAccumulator();
用于(累计:累计){
for(字符串项:累计输入列表){
合并.输入列表.添加(项);
}
}
返回合并;
}
公共字符串提取输出(Accum Accum){
返回“”;
}
}
combine perKey extending
CombineFn
没有可用的示例代码。请告诉我上面的代码有什么问题。如果您只想迭代所有值,您可以使用GroupByKey
将PCollection
转换为PCollection如果您只想迭代所有值,您可以使用GroupByKey
将PCollection
转换为PCollection