Когда вы выполняете вычисления в потоках, вы никогда не знаете, может ли или когда поступить больше данных, поэтому типичным подходом является обработка каждого события, как если бы оно было последним, и поэтому go впереди и получение результата для каждого событие. Который затем становится устаревшим или обновляется результатом, полученным в ответ на следующее событие.
Если вы не работаете с окнами, в этом случае каждое окно может рассматриваться как конечный пакет.
В вашем случае, поскольку вход является CSV-файлом, почему бы не рассматривать его как пакет вычисления?
Но независимо от того, хотите ли вы пакетную или потоковую передачу, я бы посоветовал взглянуть на таблицу Флинка и SQL API, которые поддерживают вычисление среднего значения и дисперсии как встроенные агрегатные функции . Вы можете использовать соединитель файловой системы с старым форматом csv .
Не могли бы вы сделать это с API DataStream? Да, но ...
Если вы делаете это вычисление в windows, тогда да, это просто. Просто внедрите свою бизнес логику c в ProcessWindowFunction
. Его process
методу будет передан Iterable
, содержащий все события, назначенные окну, и оттуда вы можете вычислить среднее значение, дисперсию и т. Д. c.
Но, без окон (или пакетирование) нет, не совсем. Вычисление дисперсии чисто потоковым способом на неограниченных входах не масштабируется. Вы должны сохранить все события в состоянии, а после каждого события обновлять среднее значение, а затем пересчитывать все квадратичные различия между каждым событием и средним значением.