在Scala中过滤RDD [(VertexId,(VertexId,String,String))]

时间:2018-01-20 18:25:17

标签: scala apache-spark

我有一个起源RDD:

var userNodesRdd = usersGraph.vertices.asInstanceOf[RDD[(VertexId,(VertexId, String, String))]]
userNodesRdd.foreach(println) // check
/* I see:
* (533,[533,fobi,m])
* (610,[610,pablo,m])
* (627,[627,marco,m])
* (571,[571,anna,f])
* (590,[590,luca,m])
*

我想从中获取一个只包含验证条件的元素的RDD(只有具有此方面( _ , [ _ , _ , m]) )的人。 为了这个目标,我使用了这个:

var maleUserNodesRdd = userNodesRdd.filter{
  case (_,(_,_,gender)) => gender == "m"
}
maleUserNodesRdd.foreach(println)

但我得到了:

Caused by: java.lang.ClassCastException:  org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to scala.Tuple3

为什么?

1 个答案:

答案 0 :(得分:1)

您的代码中的值为Row个对象,而不是Tuple3,因此您应该在模式中使用Row

import org.apache.spark.sql.Row

val maleUserNodesRdd = userNodesRdd.filter{
   case (_, Row(_, _, gender)) => gender == "m"
}

同时:

asInstanceOf[RDD[(VertexId,(VertexId, String, String))]]

无效只是保持

var userNodesRdd = usersGraph.vertices