case class InputRow
(unit
:Int, eventName
: String, eventTime
:java.
sql.
Timestamp, value
: Int
) { override def toString
: String
= s
"$eventTime|$unit|$eventName|$value" }
InputRow(2, "B", Timestamp.valueOf("2018-06-02 16:05:11"), 1),
InputRow(1, "A", Timestamp.valueOf("2018-06-02 16:05:12"), 2),
InputRow(2, "A", Timestamp.valueOf("2018-06-02 16:05:13"), 2),
InputRow(1, "A", Timestamp.valueOf("2018-06-02 16:05:14"), 3),
InputRow(2, "A", Timestamp.valueOf("2018-06-02 16:05:15"), 3)
)
val grouped
: Map
[(Int, String
), InputRow
] = rows
.
foldLeft(Map.
empty[(Int, String
), Seq
[InputRow
]]) { case (acc, row
) => val key
= (row.
unit, row.
eventName) // Get from the accumulator the Seq that already exists or Nil if
// this key has never been seen begore
val value
= acc.
getOrElse(key, Nil
) // Update the accumulator
acc + (key -> (value :+ row))
}
// Get the last element from the list of rows when grouped by unit and event.
.
map({case (k, v
) => k -
> v.
last})
grouped.values.foreach { row =>
println(row)
}
}
aW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcAoKY2FzZSBjbGFzcyBJbnB1dFJvdyh1bml0OkludCwgZXZlbnROYW1lOiBTdHJpbmcsIGV2ZW50VGltZTpqYXZhLnNxbC5UaW1lc3RhbXAsIHZhbHVlOiBJbnQpIHsKICBvdmVycmlkZSBkZWYgdG9TdHJpbmc6IFN0cmluZyA9IHMiJGV2ZW50VGltZXwkdW5pdHwkZXZlbnROYW1lfCR2YWx1ZSIKfQoKb2JqZWN0IE1haW4gZXh0ZW5kcyBBcHAgewogIHZhbCByb3dzID0gU2VxKAogICAgSW5wdXRSb3coMiwgIkIiLCBUaW1lc3RhbXAudmFsdWVPZigiMjAxOC0wNi0wMiAxNjowNToxMSIpLCAxKSwKICAgIElucHV0Um93KDEsICJBIiwgVGltZXN0YW1wLnZhbHVlT2YoIjIwMTgtMDYtMDIgMTY6MDU6MTIiKSwgMiksCiAgICBJbnB1dFJvdygyLCAiQSIsIFRpbWVzdGFtcC52YWx1ZU9mKCIyMDE4LTA2LTAyIDE2OjA1OjEzIiksIDIpLAogICAgSW5wdXRSb3coMSwgIkEiLCBUaW1lc3RhbXAudmFsdWVPZigiMjAxOC0wNi0wMiAxNjowNToxNCIpLCAzKSwKICAgIElucHV0Um93KDIsICJBIiwgVGltZXN0YW1wLnZhbHVlT2YoIjIwMTgtMDYtMDIgMTY6MDU6MTUiKSwgMykKICApCgogIHZhbCBncm91cGVkOiBNYXBbKEludCwgU3RyaW5nKSwgSW5wdXRSb3ddID0gCiAgICByb3dzCiAgICAgLmZvbGRMZWZ0KE1hcC5lbXB0eVsoSW50LCBTdHJpbmcpLCBTZXFbSW5wdXRSb3ddXSkgeyBjYXNlIChhY2MsIHJvdykgPT4KICAgICAgIHZhbCBrZXkgPSAocm93LnVuaXQsIHJvdy5ldmVudE5hbWUpCiAgICAgICAvLyBHZXQgZnJvbSB0aGUgYWNjdW11bGF0b3IgdGhlIFNlcSB0aGF0IGFscmVhZHkgZXhpc3RzIG9yIE5pbCBpZgogICAgICAgLy8gdGhpcyBrZXkgaGFzIG5ldmVyIGJlZW4gc2VlbiBiZWdvcmUKICAgICAgIHZhbCB2YWx1ZSA9IGFjYy5nZXRPckVsc2Uoa2V5LCBOaWwpCiAgICAgICAvLyBVcGRhdGUgdGhlIGFjY3VtdWxhdG9yCiAgICAgICBhY2MgKyAoa2V5IC0+ICh2YWx1ZSA6KyByb3cpKQogICAgfQogICAgLy8gR2V0IHRoZSBsYXN0IGVsZW1lbnQgZnJvbSB0aGUgbGlzdCBvZiByb3dzIHdoZW4gZ3JvdXBlZCBieSB1bml0IGFuZCBldmVudC4KICAgIC5tYXAoe2Nhc2UgKGssIHYpID0+IGsgLT4gdi5sYXN0fSkKICAKICBncm91cGVkLnZhbHVlcy5mb3JlYWNoIHsgcm93ID0+CiAgICBwcmludGxuKHJvdykKICB9Cn0K