我试图在RDD上映射以下函数,从每个元素的start,length和id传入。 k和kmers是RDD中所有项目的相同值。问题是我在这个映射的函数中调用了RDD.apply,所以我有这个错误:
org.apache.spark.SparkException:RDD转换和操作只能由驱动程序调用,而不能在其他转换中调用;
以下是代码:
def getGapSequence(start: Int, length: Int, id: String, k: Int, kmers: RDD[((String, Int), String)]): String ={
var tempStart = start
var totalGap = ""
do{
val tempKmer = kmers.apply((id, start))
if(tempKmer != ""){
totalGap += tempKmer
tempStart += k
}else{
totalGap += 'N'
tempStart += 1
}
}while(totalGap.length < length)
totalGap.take(length)
}
我肯定需要通过他们的密钥访问kmers的项目,否则我不知道要追加什么字符串。我也尝试将kmers转换为不同的数据类型(即Map,Array),但我得到了
org.apache.spark.SparkException:作业因阶段失败而中止:序列化任务102:102为250174590字节,超过了允许的最大值:spark.akka.frameSize(16777216 bytes)
因为我正在使用的数据量非常大。我无法分割数据,我需要上述信息。我怎样才能实现这一点,最好不要增加火花FrameSize?谢谢。
答案 0 :(得分:0)
将RDD作为参数调用无法正常工作。由于SparkContext,您需要在主应用程序代码中调用RDD。
此RDD没有SparkContext的引用。你可以采取两种方法来解决它。