Hi,

this depends on how exactly you plan to calculate the average. The original definition is based on exponentially decreasing weight of more distant (older if time is on the x-axis) data points. This (technically) means that this average at any point X1 depends on all values X0 <= X1. This would therefore require buffering (using GroupByKey) all elements in global window, doing the sorting manually and then computing the new value of the average triggering after each element. This is probably the technically correct, but most computationally intensive variant.

If the average is done over time intervals, then an other option could be to define a cut-off interval T, i.e. set the exponentially vanishing weight of value of data points to be zero at some T0 < T1 - T. If the data points come at some discrete time-intervals (minutes, hours, days), then this could mean you can split the data into time sliding windows (window interval being the cut-off interval, and slide the update interval) and assign weight for each data point in the particular time interval - i.e. how much weight does the data point have at the time of end of the sliding window. With this you could then using CombineFn to count and sum the weighted averages, which would be much more efficient.

Best,

 Jan

On 9/30/23 17:08, Balogh, György wrote:
Hi,
I want to calculate the exponential moving average of a signal using beam in java. I understand there is no time order guarantee on incoming data. What would be the simplest solution for this?
Thank you,

--

György Balogh
CTO
E       gyorgy.bal...@ultinous.com <mailto:zsolt.sala...@ultinous.com>
M       +36 30 270 8342 <tel:+36%2030%20270%208342>
A       HU, 1117 Budapest, Budafoki út 209.
W       www.ultinous.com <http://www.ultinous.com>

Reply via email to