Как мы можем суммировать только самые последние значения количества, вычисленного в каждом слое потока данных с использованием Flink? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть поток данных (из файла csv), который содержит строки и значение c (двойное) в каждой строке. Я использую keyBy () в Flink, чтобы сгруппировать эти значения по определенному атрибуту c (страна), поэтому у меня есть разные группы кортежей (страты) для каждой отдельной страны. Я вычисляю среднее значение и дисперсию для каждой группы (страты) в потоке данных и возвращаю среднее значение / дисперсию (μ / σ) для каждого слоя. В моей программе Flink мне нужно суммировать все последние значения этой величины (среднее / дисперсия), то есть самые последние значения, поступающие из каждой страты, по мере выполнения моего алгоритма. Другими словами, если величина γ (среднее значение / дисперсия) получается из каждой страты, я хочу суммировать все последние значения γ, полученные в результате вычисления γ в каждой страте. Может кто-нибудь помочь мне решить эту проблему, может быть, с помощью специального оператора c Flink?

1 Ответ

1 голос
/ 19 февраля 2020

Когда вы выполняете вычисления в потоках, вы никогда не знаете, может ли или когда поступить больше данных, поэтому типичным подходом является обработка каждого события, как если бы оно было последним, и поэтому go впереди и получение результата для каждого событие. Который затем становится устаревшим или обновляется результатом, полученным в ответ на следующее событие.

Если вы не работаете с окнами, в этом случае каждое окно может рассматриваться как конечный пакет.

В вашем случае, поскольку вход является CSV-файлом, почему бы не рассматривать его как пакет вычисления?

Но независимо от того, хотите ли вы пакетную или потоковую передачу, я бы посоветовал взглянуть на таблицу Флинка и SQL API, которые поддерживают вычисление среднего значения и дисперсии как встроенные агрегатные функции . Вы можете использовать соединитель файловой системы с старым форматом csv .

Не могли бы вы сделать это с API DataStream? Да, но ...

Если вы делаете это вычисление в windows, тогда да, это просто. Просто внедрите свою бизнес логику c в ProcessWindowFunction. Его process методу будет передан Iterable, содержащий все события, назначенные окну, и оттуда вы можете вычислить среднее значение, дисперсию и т. Д. c.

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

...