2015-08-15 4 views
0

Я видел некоторую поддержку агрегатов и присоединяется, но там не много слов об этом,Более сложные корреляции по правилам

Интересно, если шторм может коррелировать между событиями, когда нет явной корреляции-идентификатора.

Например, если у меня есть 3 (может быть больше) Резервуары, которые испускают кортежи, которые представляют Личность из разных источников.

Spout 1: 
Person: name, security_id 

Spout 2: 
Person: fullName, secId, email 

Spout 3: 
Person: email 

Конец трубы должен быть 1 список объединяемых кортежей (поля должны быть объединены со всех кортежей), я хотел бы объединить Person кортежи на основе условий, таких:

Spout1.security_id = Spout2.secId 
|| 
Spout2.email = Spout3.email 

(may be more rules) 

ответ

0

В ваше дело, кажется, что вам нужно сделать «оконный картофельный продукт» (что довольно дорого). Для этого вам нужно использовать шаблон подключения allGrouping для всех носиков на одном болте соединения. Кроме того, вы присоединяетесь к болту, вам нужно различать входящие кортежи (т. Е. Из которого извергался кортеж) с использованием input.getSourceComponent() или input.getSourceStreamId(). См. Здесь, чтобы обсудить оба метода: How to send output of two different Spout to the same Bolt?

Самой сложной частью является буферизация. Поскольку у вас нет каких-либо заказов, и вы не знаете, может ли кортеж присоединиться к будущему или нет, вам нужно некоторое время буферизировать каждый входящий кортеж (лучше всего использовать отдельные буферы для разных источников). Каждый раз, когда вы получаете кортеж, вам нужно оценить сложный предикат, используя все буферизированные кортежи. Самый сложный вопрос, на который нужно ответить, - как долго хранить кортеж в буфере. Этот вопрос зависит от приложения, поскольку это чисто семантический вопрос. Вы должны ответить на него сами.

Смежные вопросы