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個分組+合併的結果

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