Я работаю с моделью ALS Apache Spark, а метод рекомендуемаяForAllUsers возвращает фрейм данных со схемой
root
|-- user_id: integer (nullable = false)
|-- recommendations: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- item_id: integer (nullable = true)
| | |-- rating: float (nullable = true)
На практике рекомендации имеют вид WrappedArray:
WrappedArray([636958,0.32910484], [995322,0.31974298], [1102140,0.30444127], [1160820,0.27908015], [1208899,0.26943958])
Я пытаюсь извлечь просто item_ids и вернуть их как одномерный массив. Таким образом, приведенный выше пример будет [636958,995322,1102140,1160820,1208899]
Это то, что доставляет мне неприятности. Пока что у меня есть:
val numberOfRecs = 20
val userRecs = model.recommendForAllUsers(numberOfRecs).cache()
val strippedScores = userRecs.rdd.map(row => {
val user_id = row.getInt(0)
val recs = row.getAs[Seq[Row]](1)
val item_ids = new Array[Int](numberOfRecs)
recs.toArray.foreach(x => {
item_ids :+ x.get(0)
})
item_ids
})
Но это просто возвращает [I@2f318251
, и если я получу строковое значение через mkString (","), он вернет 0,0,0,0,0,0
Есть мысли о том, как я могу извлечь item_ids и вернуть их в виде отдельного одномерного массива?