2016-08-04 39 views
1

數據集:能一次的發射扳機被用來減少數據量

user: user_id, nice_id clicks: click_id, user_id, page_id, time pages: page_id, page_name output_clicks: click_id, user_nice_id, page_name, time

用戶,點擊和頁面pcollections都是無限的。新版本的用戶使用新名稱,但nice_id永遠不會更改,新版本的頁面會使用新的page_names,點擊從不會更改,但如果點擊次數的page_name發生更改,則需要新的output_click。

因此,page_id上​​的點擊和頁面之間有一個CoGroupByKey,並在全局窗口中觸發每個輸入元素,並重新發出該頁面的每次點擊,但如果我有一個類似的全局窗口和聯合組,鍵入user_id,並在每個元素上發出每次點擊時的nice_id,然後當用戶更改或重新點擊時,我們將爲用戶重新發射所有點擊。這將會是很多額外的數據。

我在想的是在user_id上按鍵組合之後,在click_id上有一個按組鍵,一個帶有隻觸發一次的觸發器的新的全局窗口,一個基本上什麼都不做的ParDo以便逐個鍵發生,然後重新建立在每個元素上觸發的全局窗口,然後再返回到page_id上​​的按鍵聯合鍵輸出結果的輸出。這似乎是可行的?但似乎......不僅有點複雜。我試圖在下面畫一張圖。

+-------+ +--------+ +------+ |Pages | | Clicks | | Users| +---+---+ +---+----+ +--+---+ | | | +---v----+ +---v----+ +---v----+ |R.Window| |R.Window| |R.Window| +------+-+ +---------+ ++-------+ | | | | +----v---v+ +v-----v---+ |CoGroupBy| |CoGroupBy | |page_id | |user_id |<-- also ParDo that outputs click_id,nice_id mapping +-------+-+ +------+---+ | | | +---v----+ | |O.Window| | +---+----+ | | | +----v---+ | |GroupBy | | |click_id| | +----+---+ | | | +----v--+ | |nothing| | |Pardo | | +---+---+ | | | +----v---+ | |R.Window| | +-+------+ | | +---v------------v+ | CoGroupBy | | click_id | +-------+---------+ | v Output

R.Window =全局,以觸發窗口與觸發器觸發一次反覆觸發新的數據 O.Window =全局窗口。

回答

1

我不認爲這會工作,通過CoGroupByUserId獲得的第一個關鍵字將通過,但所有後續記錄都將被刪除。

而不是使用CoGroupByKey,我會建議使用Flatten和CombinePerKey與自定義CombineFn。 CombineFn將在累加器中保持狀態(確保在Window變換中使用.accumulatingFiredPanes),然後可以選擇只在有新用戶名時發出元素。

(旁註:你並不需要的「無帕爾多」;只是GBK就足夠了)

+0

我略一點點,也許我不應該有。在CoGroupByUserId後面有一個ParDo,它只發出用戶和點擊都存在的記錄。另外,我們不使用user_name,我們加入了用戶來創建nice_id,並且沒有像「new」nice_id那樣的東西。用戶的nice_id是不變的,點擊的用戶永遠不會改變。 – bfabry

+0

另外我不認爲所有後續記錄將被丟棄,只有所有後續記錄每個* audit_id *權利? – bfabry

+0

我必須再次閱讀CombinePerKey和CombineFn,我沒有意識到有一種方法可以使用它們來刪除重複/不必要的更新。這是否是http://stackoverflow.com/posts/comments/64043061?noredirect=1的潛在答案? – bfabry