我正在使用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。
答案 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
将对象列表展平为单个记录