Google cloud dataflow 组合KV对的PCollection时,如何访问CombinerFn子类中的密钥?

Google cloud dataflow 组合KV对的PCollection时,如何访问CombinerFn子类中的密钥?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我正在使用CombineFn的子类来实现,而不是使用SerializableFunction package me.examples; 导入org.apache.beam.sdk.coders.AvroCoder; 导入org.apache.beam.sdk.coders.DefaultCoder; 导入org.apache.beam.sdk.transforms.Combine.CombineFn; 导入java.util.HashSet; 导入java.util.Set; 公共类Concat

我正在使用
CombineFn
的子类来实现,而不是使用
SerializableFunction

package me.examples;
导入org.apache.beam.sdk.coders.AvroCoder;
导入org.apache.beam.sdk.coders.DefaultCoder;
导入org.apache.beam.sdk.transforms.Combine.CombineFn;
导入java.util.HashSet;
导入java.util.Set;
公共类ConcatWordsCombineFn扩展了CombineFn{
@DefaultCoder(AvroCoder.class)
公共静态类累加器{
哈希集播放;
}
@凌驾
公共累加器createacculator(){
蓄能器=新蓄能器();
acculator.plays=新的HashSet();
回流蓄能器;
}
@凌驾
公共累加器addInput(累加器累加器,字符串输入){
累加器。播放。添加(输入);
回流蓄能器;
}
@凌驾
公共蓄能器合并蓄能器(可更换蓄能器){
累加器合并累加器=新累加器();
mergeacculator.plays=新的HashSet();
用于(蓄能器:蓄能器){
mergeacculator.plays.addAll(acculator.plays);
}
返回式蓄能器;
}
@凌驾
公共字符串提取输出(累加器){
//这里怎么取钥匙?
返回String.join(“,”,acculator.plays);
}
}
管道由一个
ReadFromBigQuery
ExtractAllPlaysOfWords
(下面的代码)和
WriteToBigQuery

package me.examples;
导入com.google.api.services.bigquery.model.TableRow;
导入org.apache.beam.sdk.coders.KvCoder;
导入org.apache.beam.sdk.coders.StringUtf8Coder;
导入org.apache.beam.sdk.transforms.Combine;
导入org.apache.beam.sdk.transforms.ptTransform;
导入org.apache.beam.sdk.transforms.ParDo;
导入org.apache.beam.sdk.values.KV;
导入org.apache.beam.sdk.values.PCollection;
公共类Playsford扩展了PTTransform{
@凌驾
公共PCollection展开(PCollection输入){
PCollection largeWords=input.apply(“ExtractLargeWords”,ParDo.of(new ExtractLargeWordsFn());
PCollection wordNPlays=largeWords.apply(“CombinePlays”,Combine.perKey(新的concatwords组合词fn());
wordnlays.setCoder(KvCoder.of(StringUtf8Coder.of(),StringUtf8Coder.of());
PCollection rows=wordNPlays.apply(“FormatToRow”,ParDo.of(新格式shakespeareoutputfn());
返回行;
}
}
我想访问
ConcatWordsCombineFn
中的键,以便在此基础上进行最终累加。例如,如果关键字以
a
开头,则可以将单词与
连接起来,或者使用
否则

当查看编程指南时

如果需要根据密钥更改组合策略(例如,某些用户的最小值和其他用户的最大值),可以定义KeyedCombineFn以访问组合策略中的密钥

我在org.apache.beam.sdk.transforms.Combine中找不到
keyedcombineefn

我使用Apache Beam 2.12.0和Google Dataflow作为运行程序。

我认为没有内置的方法来解决这个问题。简单的解决方法(我知道不是完美的)是将字符串包装到另一个KV:
KV
,其中两个键相同。

我为此提交了一个功能请求。我们甚至可以格式化值以包含键并保留KV类型。在没有内置功能的情况下,我认为这就是答案。