spark下生成多个returns

generate multiple returns under spark

我正在使用来自 Spark 的 ALS 库,并且在从一行生成多个 returns 时遇到了一些问题。假设我有一个文件,一行的分隔符是“#”。所以这是我到目前为止得到的:

val ratings : RDD[Rating] = data.map(_.split('#')).map(items => {
   for (i <- 1 until items.length) 
      if ( items(i).length() > 2)
         Rating(items(0).toInt, i.toInt, items(i).toDouble)    
})

理想情况下,我想生成评级类型的数据,但错误显示 "type mismatched: found Unit, required: org.apache.spark.mllib.recommendation.Rating"

有没有办法使用 Scala 在 Spark 中从一行创建多行?有什么想法吗?

我正在使用 spark 2.1.X 和 scala 2.11.

你还应该传递一些东西(Rating(-1, -1, -1.0)),以防if ( items(i).length() > 2)这个条件不满足。然后根据 Rating(-1, -1, -1.0)

筛选值

例子

val ratings : RDD[Rating] = data.map(_.split('#')).map(items => 
{
   for (i <- 1 until items.length) 
       if ( items(i).length() > 2)
          Rating(items(0).toInt, i.toInt, items(i).toDouble) 
       else
          Rating(-1, -1, -1.0) 

}
)

如果我对你的问题的理解正确,你想从 RDD 中解析一条记录,根据某些条件,你将得到两条记录并将其作为映射操作的结果传递。

如果是这种情况,那么您可以执行以下操作:

val ratings : RDD[Rating] = data.map(_.split('#')).map(items => {

    val list = new ArrayBuffer[Rating]
    for (i <- 1 until items.length) 
        list += Rating(items(i), i.toInt) 

    list
}).flatMap(row => row)

此处 flatMap 会将对象列表展平为单个记录