Хорошие новости: ваш вопрос уже содержит глаголы, которые соответствуют функциональным вызовам, которые будут использоваться в коде: группировать по, сортировать по (последней отметке времени).
сортировать InputRow
по последней отметке времени,нам понадобится неявное упорядочение:
implicit val rowSortByTimestamp: Ordering[InputRow] =
(r1: InputRow, r2: InputRow) => r1.eventTime.compareTo(r2.eventTime)
// or shorter:
// implicit val rowSortByTimestamp: Ordering[InputRow] =
// _.eventTime compareTo _.eventTime
А теперь, имея
val input: Iterator[InputRow] = // input data
Давайте сгруппируем их по (unit, eventName)
val result = input.toSeq.groupBy(row => (row.unit, row.eventName))
, затем извлечемтот, который имеет самую последнюю метку времени
.map { case (gr, rows) => rows.sorted.last }
и сортируется от самого раннего до самого последнего
.toSeq.sorted
Результат -
InputRow(2,B,2018-06-02 16:05:11.0,1)
InputRow(1,A,2018-06-02 16:05:14.0,3)
InputRow(2,A,2018-06-02 16:05:15.0,3)