如何在火花中处理错误SPARK-5063

时间:2015-04-23 06:55:47

标签: scala apache-spark

我在println

行中收到错误消息SPARK-5063
val d.foreach{x=> for(i<-0 until x.length)
      println(m.lookup(x(i)))}    

d是RDD[Array[String]] m是RDD[(String, String)]。有没有办法以我想要的方式打印?或者我如何将d从RDD[Array[String]]转换为Array[String]

2 个答案:

答案 0 :(得分:14)

SPARK-5063涉及尝试嵌套RDD操作时更好的错误消息,这是不受支持的。

这是一个可用性问题,而不是一个功能问题。根本原因是RDD操作的嵌套,解决方案是打破它。

我们正在尝试加入dRDDmRDD。如果mRDD的大小很大,那么rdd.join将是推荐的方式,否则,如果mRDD很小,即适合每个执行者的记忆,我们可以收集它,广播它和做一个'地图方'加入。

JOIN

简单的连接就是这样的:

val rdd = sc.parallelize(Seq(Array("one","two","three"), Array("four", "five", "six")))
val map = sc.parallelize(Seq("one" -> 1, "two" -> 2, "three" -> 3, "four" -> 4, "five" -> 5, "six"->6))
val flat = rdd.flatMap(_.toSeq).keyBy(x=>x)
val res = flat.join(map).map{case (k,v) => v}

如果我们想使用广播,我们首先需要在本地收集解析表的值,以便b / c到所有执行者。 注意要广播的RDD 必须适合驱动程序和每个执行程序的内存。

使用广播变量

的地图侧JOIN
val rdd = sc.parallelize(Seq(Array("one","two","three"), Array("four", "five", "six")))
val map = sc.parallelize(Seq("one" -> 1, "two" -> 2, "three" -> 3, "four" -> 4, "five" -> 5, "six"->6)))
val bcTable = sc.broadcast(map.collectAsMap)
val res2 = rdd.flatMap{arr => arr.map(elem => (elem, bcTable.value(elem)))} 

答案 1 :(得分:-1)

RDD缺少SparkContext。它可能发生在以下情况:

RDD转换和操作不是由驱动程序调用的,

但在其他内部 变换;例如,rdd1.map(x => rdd2.values.count() * x)无效 因为值转换和count动作不能在里面执行 rdd1.map转化