在火花下产生多重回报

时间:2018-08-20 05:53:36

标签: scala apache-spark apache-spark-mllib

我正在使用Spark中的ALS库,并且在从一行中生成多个返回值时遇到一些问题。说我有一个文件,一行的分隔符是“#”。所以这就是我到目前为止所得到的:

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)    
})

所以理想情况下,我想生成具有Rating类型的数据,但是错误显示“类型不匹配:找到了单位,必填:org.apache.spark.mllib.recommendation.Rating”

是否有一种方法可以使用Scala从Spark中的一行创建多个行?有什么想法吗?

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

2 个答案:

答案 0 :(得分:0)

您还应该传递一些内容(Rating(-1,-1,-1.0)),以防select s from TrainRouteData t inner join t.trainRouteStations s where s.stationSeqN >= 1 and s.stationSeqN <= 3 and t.trainRouteDescX = 'Test1-Test2' order by s.stationSeqN asc 不能满足此条件。然后根据Rating(-1,-1,-1.0)过滤值

示例

if ( items(i).length() > 2)

答案 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将对象列表展平为单个记录