我正在编写一个函数,该函数接收RDD和数字整数n
,并打印接收到的RDD的n
元素。
RDD参数没有预定的类型,并且我使用模式匹配,希望根据RDD以不同的方式打印。
例如,如果我有这个:myRDD:RDD[(String, Array[String])]
。当我调用printRddContent(myRDD)
时,我想以这种方式进行打印(在函数外,这样效果很好):
anRdd.map { case (a, arr) => (a, arr.toList) }.collect().take(n).foreach(println)
依此类推,具有不同的模式。
到目前为止,这是我的代码:
def printRddContent[A](anRdd: RDD[A], n: Int) = {
anRdd match {
case r1: RDD[(String, Array[String])] => anRdd.map { case (a, arr) => (a, arr.List) }.take(n).foreach(println)
case _ => "case clause"
}
}
但是.toList
显示一条消息:Cannot resolve symbol toList
。我不明白为什么这在函数内部不起作用。
答案 0 :(得分:2)
这是基于您提供的代码的解决方案:
def printRddContent[A](anRdd: RDD[A], n: Int) = {
anRdd match {
case r1: RDD[(String, Array[String])] => r1.asInstanceOf[RDD[(String, Array[String])]].map { case (a, arr) => (a, arr.toList)}.take(n).foreach(println)
case _ => "case clause"
}
}
在这种情况下,使用asInstanceOf
是安全的,因为我们已经检查了RDD是否完全对应于类型(通过模式匹配)