Как мы можем суммировать только самые последние значения количества, вычисленного в каждом слое потока данных с помощью Flink?

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


person T.D.    schedule 18.02.2020    source источник


Ответы (1)


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

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

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

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

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

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

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

person David Anderson    schedule 19.02.2020
comment
Большое спасибо! Могу ли я добиться этого, используя API Datastream вместо API таблиц и SQL? - person T.D.; 19.02.2020
comment
Table API в настоящее время основан на DataStream API, поэтому все также можно реализовать вручную с помощью соответствующего окна и агрегаты. - person Arvid Heise; 19.02.2020