我在println
行中收到错误消息SPARK-5063val 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]
?
答案 0 :(得分:14)
SPARK-5063涉及尝试嵌套RDD操作时更好的错误消息,这是不受支持的。
这是一个可用性问题,而不是一个功能问题。根本原因是RDD操作的嵌套,解决方案是打破它。
我们正在尝试加入dRDD
和mRDD
。如果mRDD
的大小很大,那么rdd.join
将是推荐的方式,否则,如果mRDD
很小,即适合每个执行者的记忆,我们可以收集它,广播它和做一个'地图方'加入。
简单的连接就是这样的:
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 必须适合驱动程序和每个执行程序的内存。
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
转化