У меня есть такой набор искровых данных:
+--------+--------------------+
| uid| recommendations|
+--------+--------------------+
|41344966|[[2133, red]...|
|41345063|[[11353, red...|
|41346177|[[2996, yellow]...|
|41349171|[[8477, green]...|
res98: org.apache.spark.sql.Dataset[userItems] = [uid: int, recommendations: array<struct<iid:int,color:string>>]
Я хочу отфильтровать каждый массив рекомендаций, чтобы он содержал первые два каждого цвета.Псевдо пример:
[(13,'red'), (4,'green'), (8,'red'), (2,'red'), (10, 'yellow')]
станет
[(13,'red'), (4,'green'), (8,'red'), (10, 'yellow')]
Как я могу эффективно сделать это в Scala с наборами данных?Есть ли элегантное решение, использующее что-то вроде reduceGroups
?
Что у меня есть до сих пор:
case class itemData (iid: Int, color: String)
val filterList = (recs: Array[itemData], filterAttribute, maxCount) => {
// filter the list somehow... using the max count and attribute
})
dataset.map(d => filterList(d.recommendations, "color", 2))