apache beam入门之group分组操作

目录:apache beam 个人使用经验总结目录和入门指导(Java)

如果我们希望将相同的元素进行分组,则可以用Group的转化方法进行操作
首先我们生成1个单词数据集

List<String> strLists = new ArrayList<>();
strLists.add("cat");
strLists.add("cat");
strLists.add("cat");
strLists.add("dog");
strLists.add("dog");
strLists.add("panda");
// 创建字符串输入
PCollection<String> words = pipeline.apply(Create.of(strLists));

接着要引入1个KV的类, 这个类在beam里很重要
KV.of(key, value) 即可生成1个键值对
我们把每个单词都变成 (单词,1)的键值对

// 全部转成KV形式
PCollection<KV<String, Integer>> kvpCollection
	= words.apply(MapElements.via(new SimpleFunction<String, KV<String, Integer>>() {
	@Override
	public KV<String, Integer> apply(String str) {
		return KV.of(str, 1);
}
}));

PCollection<KV<String, Integer>> kvpCollection里的内容如下:
KV[cat,1]
KV[cat,1]
KV[cat,1]
KV[dog,1]
KV[dog,1]
KV[panda,1]

接着我们组装GroupByKey,即可进行分组

PCollection<KV<String, Iterable<Integer>>> groupKv = kvpCollection.apply(GroupByKey.create());

我们会得到1个KV<String,Iterable<Integer> >, 可以理解为如下:
KV[cat, [1,1,1]]
KV[dog, [1,1]]
KV[panda, [1]]
即所有键值为cat的kv都合到了一起,组成了1个迭代器,完成了分组,后续我们就可以对这3个KV里的迭代器做操作,计算单词数量, 也就完成了一次wordCount的例子。
注意事项: 分组的键值类型不可以是Double或者Float,因为这2个类型是不精确的类型,无法进行精确分组,使用时会报错

直接用官方SDK做wordCount

假设我们有了PCollection<KV<String, Integer>> kvpCollection, 可以不用GroupByKey,而是直接

PCollection<KV<String, Integer>> pWordCount
= kvpCollection.apply(Sum.integersPerKey());

这时候就能得到
KV[cat, 3]
KV[dog, 2]
KV[panda,1]
的这么1个分组+合并的结果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章