Since you said it was possible, I kept reading over the scalding's scanleft. I didn't find any examples on the web. This was a good scalding exercise.
Point 1 in
Moving Window Calculation (via Scalding) helped me realize the accumulator didn't have to be tied to the output. With that in mind and the assumption of how
the converters and setters should be used, the rest was just matching up the tuple types. I even figured out how to do the setter and converter with anonymous classes.
The code is below. Is this what you had in mind?
.groupBy('field1,'field2)
{group => group.sortBy('field3)
.scanLeft(('field4,'field5') -> ('desiredfield))(0.0,0.0,0.0)(
function that takes in tuple with two doubles from tuple and updates accumulator which is a tuple with three doubles.
)(new TupleSetter[(Double, Double, Double)]
{
override def apply(arg: (Double, Double, Double)): Tuple = { val t = new Tuple(); t.addDouble(arg._3); t }
override def arity: Int = 1
}
, new TupleConverter[(Double, Double)]
{
override def apply(te: TupleEntry): (Double, Double) =
{
val r =te.getTuple()
(r.getDouble(0),r.getDouble(1))
}
override def arity: Int = 1
}
)