Scala spark can';t使用yield访问flatmap之后的元组
我无法使用Scala spark can';t使用yield访问flatmap之后的元组,scala,apache-spark,tuples,yield,flatmap,Scala,Apache Spark,Tuples,Yield,Flatmap,我无法使用x访问每个元组值。_2我相信flatMap()中的代码块不会对任何对象求值。您应该删除val pairs=或显式返回pairs——例如 test_rated.map(x => x._2) 假设代码的其余部分是正确的,并且类型匹配(如果没有[mcve]就不可能),那么这样做是错误的。让我们简化流程以说明原因: pearson.flatMap(x => { ... val pairs = ... pairs }).filter(...) 您可以收集: sca
x访问每个元组值。_2
我相信flatMap()
中的代码块不会对任何对象求值。您应该删除val pairs=
或显式返回pairs
——例如
test_rated.map(x => x._2)
假设代码的其余部分是正确的,并且类型匹配(如果没有[mcve]就不可能),那么这样做是错误的。让我们简化流程以说明原因:
pearson.flatMap(x => {
...
val pairs = ...
pairs
}).filter(...)
您可以收集:
scala> res0.filter(x => x != ())
res1: scala.collection.immutable.IndexedSeq[AnyVal] = Vector(2, 4)
但你真的应该用保护的表达:
scala> res0.collect { case x: Int => x}
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4)
scala>for{
|x{
val bid1=x._1._1.toInt
val bid2=x._1._2.toInt
val sim=x._2.toDouble
def保持(tid)={
测试地图包含((tid,bid2))和列车地图包含((tid,bid1))
}
为了{
tid我确实显式返回了pairs抱歉,我的错,我包含了错误的代码。显式返回pairs,因为上面的格式仍然不允许我在likex之后访问map操作中的元组。_2
你能提供你的pearson、test\u用户、test\u map和train\u map
的样本数据吗?pearson
是一个rdd,每行都是((bid1,bid2),sim)
测试用户
是一个scala 1D列表测试地图,在这种情况下,训练地图应该不重要,因为它只用于条件语句,非常感谢!进行一点跟踪,如果说在for循环中没有任何项目符合条件,会产生什么回报?
scala> res0.filter(x => x != ())
res1: scala.collection.immutable.IndexedSeq[AnyVal] = Vector(2, 4)
scala> res0.collect { case x: Int => x}
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4)
scala> for {
| x <- 1 to 5 if x % 2 == 0
| } yield x
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4)
val test_rated = pearson.flatMap(x => {
val bid1 = x._1._1.toInt
val bid2 = x._1._2.toInt
val sim = x._2.toDouble
def keep(tid) = {
test_map.contains((tid, bid2)) && train_map.contains((tid, bid1))
}
for {
tid <- test_users.map(_.toInt) if keep(tid)
} yield ((tid, bid2), (bid1, sim))
})