如何在RDD中映射和应用并避免在转换中进行转换

时间:2016-07-11 17:54:12

标签: scala apache-spark transformation rdd

我试图在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?谢谢。

1 个答案:

答案 0 :(得分:0)

将RDD作为参数调用无法正常工作。由于SparkContext,您需要在主应用程序代码中调用RDD。

此RDD没有SparkContext的引用。你可以采取两种方法来解决它。

  1. 在主App中运行此代码。这样就可以了。
  2. 将SparkContext更改为全局变量然后,不在参数中设置RDD,而是在函数内设置此RDD。该参数应该是您需要的文件的路径。