Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala spark can';t使用yield访问flatmap之后的元组_Scala_Apache Spark_Tuples_Yield_Flatmap - Fatal编程技术网

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,因为上面的格式仍然不允许我在like
x之后访问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))
})